使用多个PDO预处理语句
问题描述:
一个别名表由于需要将多个表在单个查询,我不能对外部查询使用SQL_CALC_FOUND_ROWS
(或LIMIT
)(数量会高于预期)。使用多个PDO预处理语句
这里是理想的查询,如果子查询中使用MySQL的SQL_CALC_FOUND_ROWS
支持:
SELECT events.*, bands.*
FROM events
LEFT JOIN bands ON events.event_id = bands.event_id
WHERE e.event_id IN (
SELECT * FROM (
SELECT SQL_CALC_FOUND_ROWS e.event_id
FROM events
WHERE events.date > NOW()
ORDER BY events.date ASC LIMIT 0, 25
) ALIAS
)
ORDER BY events.date ASC
This question建议创建别名的表,但我不知道如果我能做到这一点与PDO预处理语句。
我尝试这一点,但因为FOUND_EVENTS被解释为一个(不存在)列名了解析错误:
$st1 = $pdo->prepare("(SELECT SQL_CALC_FOUND_ROWS e.event_id
FROM events
WHERE events.date > NOW()
ORDER BY events.date ASC LIMIT 0, 25
) AS FOUND_EVENTS");
$st2 = $pdo->prepare("SELECT events.*, bands.*
FROM events
LEFT JOIN bands ON events.event_id = bands.event_id
WHERE e.event_id IN (
FOUND_EVENTS
)
ORDER BY events.date ASC");
$st1->execute();
$st2->execute();
我宁愿坚持预处理语句,如果有可能,但是任何可行的解决方案将是大!
答
我会做两个单独的查询。
如果您之所以使用SQL_CALC_FOUND_ROWS是尽量节省运行时间,你可能会惊讶地知道,在许多情况下,这将是很多,很多更快,负荷较小的数据库,使用两个独立的而是用一个简单的COUNT(*)分组函数来计算总行数,另一个使用LIMIT来实际检索行。
Here is more explanation of why this is the case。
更重要的是,如果你在两个单独的查询做,那么你可以这样做实际上获取行的一个第一,然后你只需要做的COUNT(*)如果第一个第二个返回最大行数。
奇怪的是,性能会受到影响。虽然性能对我的问题并不完全至关重要(结果将被缓存),但这似乎是最简单的解决方案。谢谢! – nathanb