2016-09-27 22 views
4

我有一個表data_summaries。它有item_id INT(11)user_grouping TEXTvalue DECIMAL(10,2)這樣的列。無法在MySQL中使用某些GROUP BY條件對AVG值進行ORDER BY

如果我嘗試做一個查詢組的結果通過user_grouping和訂單他們通過valueAVG,失敗:

SELECT user_grouping, AVG(value) AS avg_value, SUM(value) AS sum_value 
FROM data_summaries 
GROUP BY user_grouping 
ORDER BY avg_value 
+---------------+-----------+-----------+ 
| user_grouping | avg_value | sum_value | 
+---------------+-----------+-----------+ 
| London  | 50.609733 | 18978.65 | 
| Paris   | 50.791733 | 19046.90 | 
| New York  | 51.500400 | 2575.02 | 
| NULL   | 49.775627 | 18665.86 | 
+---------------+-----------+-----------+ 

ORDER BY條款似乎在做東西爲它確實改變了順序:

SELECT user_grouping, AVG(value) AS avg_value, SUM(value) AS sum_value 
FROM data_summaries 
GROUP BY user_grouping 
+---------------+-----------+-----------+ 
| user_grouping | avg_value | sum_value | 
+---------------+-----------+-----------+ 
| NULL   | 49.775627 | 18665.86 | 
| New York  | 51.500400 | 2575.02 | 
| London  | 50.609733 | 18978.65 | 
| Paris   | 50.791733 | 19046.90 | 
+---------------+-----------+-----------+ 

在另一方面,由訂購如預期的value作品:

SELECT user_grouping, AVG(value) AS avg_value, SUM(value) AS sum_value 
FROM data_summaries 
GROUP BY user_grouping 
ORDER BY sum_value 
+---------------+-----------+-----------+ 
| user_grouping | avg_value | sum_value | 
+---------------+-----------+-----------+ 
| New York  | 51.500400 | 2575.02 | 
| NULL   | 49.775627 | 18665.86 | 
| London  | 50.609733 | 18978.65 | 
| Paris   | 50.791733 | 19046.90 | 
+---------------+-----------+-----------+ 

如果我組由item_id代替,然後由AVG作品訂購:

SELECT item_id, AVG(value) AS avg_value, SUM(value) AS sum_value 
FROM data_summaries 
GROUP BY item_id 
+---------+-----------+-----------+ 
| item_id | avg_value | sum_value | 
+---------+-----------+-----------+ 
|  4 | 49.318225 | 11392.51 | 
|  1 | 49.737835 | 11489.44 | 
|  2 | 50.420606 | 11647.16 | 
|  6 | 51.024242 | 11786.60 | 
|  5 | 51.456537 | 11886.46 | 
|  3 | 53.213000 | 1064.26 | 
+---------+-----------+-----------+ 

我怎麼會需要改變第一個查詢得到它通過有序平均?

回答

3

這是一個MySQL錯誤,參見Unexpected order for grouped query,涉及avg()text組合的組合。它仍然在MySQL 5.7.15中打開。

作爲一種解決方法,您可以將數據類型更改爲varchar。如果你不需要索引,以加快步伐,鑄造應太:

SELECT cast(user_grouping as char(200)), AVG(value) AS avg_value, SUM(value) AS sum_value 
FROM data_summaries 
GROUP BY cast(user_grouping as char(200)) 
ORDER BY avg_value 

更新:

的BUG在MySQL 5.7.17:即分別組成上

查詢一個基於BLOB的類型的列,並且根據AVG(),VAR_POP()或STDDEV_POP()聚合函數的結果排序,如果使用InnoDB臨時表,則會返回錯誤順序的結果。 (Bug#22275357,Bug#79366)

+0

啊,謝謝!我的谷歌搜索量沒有得到這個錯誤報告。解決方法產生所需的結果。 –