如何避免错误“SQL_CALC_FOUND_ROWS的使用/放置不正确”?

时间:2015-01-23 16:01:42

标签: mysql sql-calc-found-rows

我们在我们的应用程序中有两个查询,第一个很长,需要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解决方案,所以我们不必在必要时更改代码。

1 个答案:

答案 0 :(得分: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