计入查询破坏预期结果
Count in query ruin expected result
数据库结构
数据
查询中没有计数:
SELECT id, a FROM test ORDER BY a ASC LIMIT 1
好成绩:
查询中有计数:
SELECT id, a, COUNT(*) FROM test ORDER BY a ASC LIMIT 1
错误结果:
为什么会这样?什么是备选方案?
尝试
SELECT id, a,
(SELECT COUNT(*) FROM test) as cnt
FROM test
ORDER BY a ASC LIMIT 1
它应该给出预期的结果。尽管我很确定优化器只会执行一次子查询,但使用 EXPLAIN
检查执行计划总是有意义的。
当您在查询中使用聚合函数时,您不能 select sql 中的任何其他属性,除非并且直到 'GROUP BY' 子句中使用其他属性。所以解决它的方法可能是
SELECT id,a,t.cnt
FROM (SELECT count(*) as cnt FROM test) as t, test
ORDER BY a LIMIT 1;
DBMS 正在执行如下操作,因为缺少 id
和 a
的聚合,它会选择它想要的任何值。
SELECT id, a, COUNT(*) FROM (
SELECT 1 AS dummy, id, a FROM test
) t
GROUP BY dummy
ORDER BY a ASC LIMIT 1
在其他 DBMS 中您可以使用 WITH
,因此您不必重写 where 子句(在 MySQL 中您只能创建一个视图来模拟它)。请参阅@a1ex07 的正确查询答案。
数据库结构
数据
查询中没有计数:
SELECT id, a FROM test ORDER BY a ASC LIMIT 1
好成绩:
查询中有计数:
SELECT id, a, COUNT(*) FROM test ORDER BY a ASC LIMIT 1
错误结果:
为什么会这样?什么是备选方案?
尝试
SELECT id, a,
(SELECT COUNT(*) FROM test) as cnt
FROM test
ORDER BY a ASC LIMIT 1
它应该给出预期的结果。尽管我很确定优化器只会执行一次子查询,但使用 EXPLAIN
检查执行计划总是有意义的。
当您在查询中使用聚合函数时,您不能 select sql 中的任何其他属性,除非并且直到 'GROUP BY' 子句中使用其他属性。所以解决它的方法可能是
SELECT id,a,t.cnt
FROM (SELECT count(*) as cnt FROM test) as t, test
ORDER BY a LIMIT 1;
DBMS 正在执行如下操作,因为缺少 id
和 a
的聚合,它会选择它想要的任何值。
SELECT id, a, COUNT(*) FROM (
SELECT 1 AS dummy, id, a FROM test
) t
GROUP BY dummy
ORDER BY a ASC LIMIT 1
在其他 DBMS 中您可以使用 WITH
,因此您不必重写 where 子句(在 MySQL 中您只能创建一个视图来模拟它)。请参阅@a1ex07 的正确查询答案。