奇怪的结果是MySQL查询

时间:2017-03-29 07:59:05

标签: mysql sql

我有这个问题:

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');

1 个答案:

答案 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;