在多个PDO准备语句中使用别名表

时间:2011-11-07 03:21:11

标签: php mysql pdo subquery prepared-statement

由于需要在单个查询中连接多个表,我无法在外部查询上使用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();

如果可能的话,我更愿意坚持准备好的陈述,但任何有效的解决方案都会很棒!

1 个答案:

答案 0 :(得分:0)

我会在两个单独的查询中完成。

如果您使用SQL_CALC_FOUND_ROWS的原因是尝试并节省执行时间,您可能会惊讶地发现,在许多情况下,它将更多,更多更快,并且数据库负载更少,使用两个单独的查询,其中一个使用简单的COUNT(*)分组函数来计算总行数,另一个使用LIMIT来实际检索行。

Here is more explanation of why this is the case

更重要的是,如果您在两个单独的查询中执行此操作,那么您可以执行实际提取行首先的那个,然后您只需要使用COUNT(*)执行第二个行如果第一个返回了最大行数。