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