由于需要在单个查询中连接多个表,我无法在外部查询上使用SQL_CALC_FOUND_ROWS
(或LIMIT
)(该数字将高于预期)。< / p>
如果在子查询中使用SQL_CALC_FOUND_ROWS
支持MySQL,那么这是理想的查询:
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();
如果可能的话,我更愿意坚持准备好的陈述,但任何有效的解决方案都会很棒!
答案 0 :(得分:0)
我会在两个单独的查询中完成。
如果您使用SQL_CALC_FOUND_ROWS的原因是尝试并节省执行时间,您可能会惊讶地发现,在许多情况下,它将更多,更多更快,并且数据库负载更少,使用两个单独的查询,其中一个使用简单的COUNT(*)分组函数来计算总行数,另一个使用LIMIT来实际检索行。
Here is more explanation of why this is the case
更重要的是,如果您在两个单独的查询中执行此操作,那么您可以执行实际提取行首先的那个,然后您只需要使用COUNT(*)执行第二个行如果第一个返回了最大行数。