使用多个PDO预处理语句

使用多个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(*)如果第一个第二个返回最大行数。

+0

奇怪的是,性能会受到影响。虽然性能对我的问题并不完全至关重要(结果将被缓存),但这似乎是最简单的解决方案。谢谢! – nathanb