5

我有一张名为“值”的表:

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

这里发生了什么?

4

2 回答 2

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;
于 2013-06-19T08:51:15.360 回答
1

这是MySQL 5.7 文档中的一个片段,应该会有所帮助:

在 SELECT 语句中,每个选择表达式仅在发送到客户端时才被计算。这意味着在 HAVING、GROUP BY 或 ORDER BY 子句中,引用在选择表达式列表中分配了值的变量不会按预期工作:

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

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

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

运行一个解释可能会告诉你到底发生了什么;尝试这个可能是一个很好的练习。

于 2013-06-19T09:13:42.347 回答