【问题标题】:How to avoid error "Incorrect usage/placement of SQL_CALC_FOUND_ROWS"?如何避免错误“SQL_CALC_FOUND_ROWS 的使用/放置不正确”?
【发布时间】:2015-03-22 17:23:48
【问题描述】:

我们的应用程序中有两个查询,第一个很长,需要 30 秒,然后另一个查询 LIMIT 之前的行数:

SELECT DISTINCT SQL_CALC_FOUND_ROWS res.*,...GROUP BY...HAVING...ORDER BY fqa_value LIMIT 0,10;
SELECT FOUND_ROWS() as count

如果我们取出“ORDER BY fqa_value”,我们可以将速度从 30 秒优化到 1 秒。

所以我将所有内容都放在一个子选择中,然后对其进行排序:

select * from (
    SELECT DISTINCT SQL_CALC_FOUND_ROWS res.*,...GROUP BY...HAVING...LIMIT 0,10;
) as temptable order by fqa_value;

但是,这给了我错误:“SQL_CALC_FOUND_ROWS 的使用/放置不正确”。

如果我取出 SQL_CALC_FOUND_ROWS,它会起作用:

select * from (
    SELECT DISTINCT res.*,...GROUP BY...HAVING...ORDER BY fqa_value LIMIT 0,10
) as temptable order by fqa_value;

但是我没有在 GROUP BY 和 HAVING 之前选择的原始行数。

我如何才能 (a) 计算原始行数和 (b) 快速查询?我正在寻找一个纯粹的 MySQL 解决方案,这样我们就不必在必要时更改代码。

【问题讨论】:

    标签: mysql sql-calc-found-rows


    【解决方案1】:

    SQL_CALC_FOUND_ROWS 应该在distinct 之前:

    SELECT SQL_CALC_FOUND_ROWS DISTINCT res.*,...GROUP BY...HAVING...ORDER BY fqa_value LIMIT 0,10;
    SELECT FOUND_ROWS() as count
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-13
    • 1970-01-01
    • 2018-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-17
    • 1970-01-01
    相关资源
    最近更新 更多