组上的MySQL COUNT()返回错误的行数

时间:2013-06-19 08:43:18

标签: mysql select count group-by

我有一个名为“values”的表:

value
12
13
5
56
3
56
79
98
58
74
52
2
8
32
4

我想获得每个5块的最低值,所以我尝试了这个查询:

SET @a = -1;
SELECT FLOOR((@a:=@a+1)/5) AS block, MIN(value)
FROM values
GROUP BY block

看起来这个查询不包含每个块中的最后一行,所以我尝试了数:

SET @a = -1;
SELECT FLOOR((@a:=@a+1)/5) AS block, COUNT(value)
FROM values
GROUP BY block

返回:

block    COUNT(value)
0        4
1        4
2        4

这里发生了什么?

2 个答案:

答案 0 :(得分:2)

试试这个:

SELECT FLOOR(id/5) AS block, MIN(`value`)
FROM (SELECT (@id:=@id+1) AS id, `value`
      FROM `values`, (SELECT @id:=-1) AS A) AS B
GROUP BY block;

答案 1 :(得分:1)

以下是MySQL 5.7 documentation中应该有用的代码段:

  

在SELECT语句中,仅在发送到客户端时评估每个select表达式。这意味着在HAVING,GROUP BY或ORDER BY子句中,引用在select表达式列表中赋值的变量不能按预期工作:

mysql> SELECT (@aa:=id) AS a, (@aa+3) AS b FROM tbl_name HAVING b=5;
  

HAVING子句中对b的引用是指选择列表中使用@aa的表达式的别名。这不能按预期工作:@aa包含上一个选定行的id值,而不是当前行。

您的查询使用block作为GROUP_BY子句中的表达式,其中block是赋值的结果,因此您的情况类似于MySQL文档中的情况。鉴于你“一个接一个”,它看起来很有希望!

运行解释可能会告诉您完全正在发生的事情;尝试这个可能是一个很好的练习。