繁体   English   中英

MySQL查询中的奇怪结果

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM