计入查询破坏预期结果

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 正在执行如下操作,因为缺少 ida 的聚合,它会选择它想要的任何值。

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 的正确查询答案。