MySQL group by函數的使用

問題:

最近遇到個奇怪的問題,有個sql在開發庫運行正常,但是發到生產上就報錯,最後幾經周折找到了原因 原來是group by函數使用不當造成的,5.7及以上版本的MySQL會出現此問題,特此記錄以作紀念。

如圖所示記錄,我們需要查所有用戶的no、name信息,sql如下:

select customer_no, customer_name from customer_info group by customer_no;

 

5.7及以上版本的MySQL報錯:

解決:

1、修改sql

翻閱資料發現:在標準SQL中使用group by時,要查詢的字段 需要加在group by後面作爲分組條件、或者用聚合函數處理一下,例如:

select customer_no, customer_name from customer_info group by customer_no,customer_name ;

或者

select customer_no, max(customer_name) from customer_info group by customer_no;

2、更改mysql參數

在舊版本中之所以沒有這種限制是因爲:MySQL擴展了 GROUP BY的用途允許你可以使用SELECT 列表中不出現在GROUP BY語句中的列,通過only_full_group_by參數可以控制這種限制,在舊版本中這個模式是默認關閉的,而在5.7.5之後默認開啓了這個模式。

查看sql_mode:

SELECT @@sql_mode; 

ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION 

去掉ONLY_FULL_GROUP_BY,重新設置值 

SET @@global.sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'; 

上面是改變了全局sql_mode,對於新建的數據庫有效。對於已存在的數據庫,則需要在對應的數據下執行

SET sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'; 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章