[英]Weird result in MySQL query
我有这个查询:
SELECT COUNT(1), name, (@i := @i + 1) AS counter FROM mytbl, (SELECT @i := 0) tmp_tbl GROUP BY counter
对于此查询,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');
如MySQL文档中所述 ,我们不应为用户变量分配值,而应在同一条语句中读取该值。 我们可能会得到预期的结果,但这不能保证。 更改语句(例如,通过添加GROUP BY,HAVING或ORDER BY子句)可能会导致MySQL选择评估顺序不同的执行计划。
在您的查询中, 计数器字段将在SELECT语句中求值,然后在GROUP BY语句中使用。 似乎当我们将聚合函数添加到SELECT语句时,在GROUP BY语句中使用的字段将被评估2次。
我已经创建了一个演示 ,您可以检查一下。 在演示中,我有这个查询
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,组字段增加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;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.