【问题标题】:Using an aliased table in multiple PDO Prepared Statements在多个 PDO 准备语句中使用别名表
【发布时间】:2011-11-07 03:21:10
【问题描述】:

由于需要在单个查询中连接多个表,我无法在外部查询中使用SQL_CALC_FOUND_ROWS(或LIMIT)(数量会高于预期)。

这是理想的查询,如果 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();

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

【问题讨论】:

    标签: php mysql pdo subquery prepared-statement


    【解决方案1】:

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

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

    Here is more explanation of why this is the case.

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

    【讨论】:

    • 性能会受到影响,这很奇怪。虽然性能对我的问题并不完全重要(结果将被缓存),但这似乎是最简单的解决方案。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2014-04-19
    • 2013-11-09
    • 2010-11-18
    • 2016-12-30
    • 1970-01-01
    • 1970-01-01
    • 2013-12-31
    • 2013-04-21
    相关资源
    最近更新 更多