我有这个查询:
SELECT COUNT(1),名称,(@i := @i + 1) AS 计数器 FROM mytbl,(SELECT @i := 0) tmp_tbl GROUP BY 计数器
对于此查询,计数器列的值增加 2。
但是如果我删除 COUNT(1),例如:
SELECT 名称,(@i := @i + 1) AS 计数器 FROM mytbl,(SELECT @i := 0) tmp_tbl GROUP BY 计数器
计数器列的值增加 1。
谁能解释一下为什么会出现这种行为?
<小时/>表格为:
创建表 mytbl(名称 VARCHAR(20));
有数据:
插入 mytbl 值
('a1'),
('a2'),
('a3');
最佳答案
如 MySQL document 中所述,我们不应该在同一语句中为用户变量赋值并读取该值。我们可能会得到预期的结果,但这并不能保证。更改语句(例如,通过添加 GROUP BY、HAVING 或 ORDER BY 子句)可能会导致 MySQL 选择具有不同评估顺序的执行计划。
在您的查询中,计数器字段将在 SELECT 语句中求值,然后在 GROUP BY 语句中使用。似乎当我们向 SELECT 语句添加聚合函数时,GROUP BY 语句中使用的字段将被评估 2 次。
我创建了一个 demo ,你可以检查一下。在演示中,我有这个查询
SELECT Count(1),
name,
( @i := @i + 1 ) AS counter,
( @j := @j + 1 ) AS group_field
FROM (SELECT 'A' AS name
UNION
SELECT 'B' AS name
UNION
SELECT 'C' AS name) mytable,
(SELECT @i := 0) tmp_tbl,
(SELECT @j := 0) tmp_tbl1
GROUP BY group_field;
执行结果中,counter字段仅增加1,group_field增加2。
要使计数器字段只增加1,你可以尝试这个
SELECT Count(1),
name,
counter
FROM (SELECT name,
( @i := @i + 1 ) AS counter
FROM mytbl,
(SELECT @i := 0) tmp_tbl) data
GROUP BY counter;
关于mysql - MySQL 查询的奇怪结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43087669/