我有一个名为“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
这里发生了什么?
答案 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文档中的情况。鉴于你“一个接一个”,它看起来很有希望!
运行解释可能会告诉您完全正在发生的事情;尝试这个可能是一个很好的练习。