2017-03-29 51 views
0

我有這樣的查詢:怪異的結果在MySQL查詢

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

+0

沒有任何樣本數據,這將有助於我們重現您提到這真的很難檢查問題的問題。 –

+0

@GiorgosBetsos請參閱編輯。 :) – artaxerxe

回答

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;