计入查询破坏预期结果

时间:2016-11-06 00:13:28

标签: mysql sql mariadb

数据库结构

Database structure

数据

data

查询中没有计数:

SELECT id, a FROM test ORDER BY a ASC LIMIT 1 

结果很好:without count

查询中的计数:

SELECT id, a, COUNT(*) FROM test ORDER BY a ASC LIMIT 1 

结果不佳:with count

为什么会这样?什么是替代方案?

3 个答案:

答案 0 :(得分:3)

尝试

SELECT id, a, 
(SELECT COUNT(*) FROM test) as cnt 
FROM test
ORDER BY a ASC LIMIT 1 

它应该给出预期的结果。即使我非常确定优化器只会执行一次子查询,但使用EXPLAIN检查执行计划总是有意义的。

答案 1 :(得分:0)

在查询中使用聚合函数时,不能在sql中选择任何其他属性,除非并且直到在“GROUP BY”子句中使用other属性。所以解决它可能是

SELECT id,a,t.cnt
FROM (SELECT count(*) as cnt FROM test) as t, test
ORDER BY a LIMIT 1;

答案 2 :(得分:0)

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的答案。