我有这个问题:
SELECT COUNT(1), name, (@i := @i + 1) AS counter FROM mytbl, (SELECT @i := 0) tmp_tbl GROUP BY counter
对于此查询,计数器列将其值增加为2。
但是如果我删除COUNT(1),例如:
SELECT name, (@i := @i + 1) AS counter FROM mytbl, (SELECT @i := 0) tmp_tbl GROUP BY counter
计数器列用1增加其值。
任何人都可以解释为什么会出现这种情况吗?
表格如下:
create table mytbl (name VARCHAR(20));
使用数据:
INSERT INTO mytbl VALUES
('a1'),
('a2'),
('a3');
答案 0 :(得分:1)
如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;
在执行结果中,计数器字段仅增加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;