mysql - MySQL 查询的奇怪结果

标签 mysql sql

我有这个查询:

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/

相关文章:

mysql - MySQL中计算每个人的房屋数

MySQL 连接器/网络跟踪

sql - 希望在一份声明中更新现有记录

mysql - 遍历一组请求数据并将每组保存到数据库 laravel

mysql - 如何在 SQL 中插入/不存在

SQL Server 链接数据库别名

sql - 创建一个启用/禁用(取决于传递的参数)所有外键的存储过程(DB2,V10.5)

Mysql 为表创建查询

mysql - 解决MySQL复杂父子查询

mysql - 在 prestashop 的 MySQL 的哪个表中,我可以找到字段 Displayed text when in stock