[精讚] [會員登入]
2902

group by的語法在mysql升級後後就不正常了,怎麼回事?

ONLY_FULL_GROUP_BY這個變數是怎樣,讓我原本可以用的語法失效了?

分享此文連結 //n.sfs.tw/13050

分享連結 group by的語法在mysql升級後後就不正常了,怎麼回事?@新精讚
(文章歡迎轉載,務必尊重版權註明連結來源)
2019-10-25 01:00:17 最後編修
2019-01-21 17:01:00 By 張○○
 

自動目錄

mysql 到了5.6.5版之後,把一個稱為 ONLY_FULL_GROUP_BY 參數啟動後,原來很多語法就報錯了。

以下的範例來自於mysql官網[1]。

情況1

要選取的address欄位沒有在group by 的項目中。

mysql> SELECT name, address, MAX(age) FROM t GROUP BY name;

ERROR 1055 (42000): 't.address' isn't in GROUP BY

 

情況2

having語法中使用的 max_age欄位不存在group by 項目中

mysql> SELECT name, MAX(age) AS max_age FROM t GROUP BY name  HAVING max_age < 30;

ERROR 1463 (42000): Non-grouping field 'max_age' is used in HAVING clause

 

情況3

MAX函數要和group by 一起用

SELECT name, MAX(age) FROM t;

ERROR 1140 (42000): Mixing of GROUP columns (MIN(),MAX(),COUNT(),...) with no GROUP columns is illegal if there is no GROUP BY clause

 

這樣很不方便,因為有時其它的欄位是拿來參考用的,至少群組時會列舉第一筆,這樣比對資料很方便。

系統及版本

select @@version

10.1.28-MariaDB

Freebsd 11

解決的方法

查看現有參數

SELECT @@sql_mode

mysql> SELECT @@sql_mode;
+-----------------------------------------------------------------------------------------------------------------------+
| @@sql_mode                                                                                                            |
+-----------------------------------------------------------------------------------------------------------------------+
| ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION |
+-----------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

把那個 ONLY_FULL_GROUP_BY 移掉,使用replace函數[3]。

mysql> SET sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY,',''));

如果要加回去

mysql> SET sql_mode=(SELECT CONCAT(@@sql_mode,',ONLY_FULL_GROUP_BY'));

若有其他sql_mode也用相同的方法處理

重新啟動mysql

 

參考資料

[1] https://dev.mysql.com/doc/refman/5.6/ja/sql-mode.html

[2] https://blog.csdn.net/lm409/article/details/73065217

[3] https://stackoverflow.com/questions/23921117/disable-only-full-group-by

END

你可能感興趣的文章

[MySQL] console mode 的亂碼處理 使用MySQL的console mode如果出現亂碼 在,要怎麼處理?

[Mysql/Mariadb] 忘記root密碼 常常會忘記root 密碼,簡單的幾步驟回復

[Mysql] 資料型態int, float, double, text, char, varchar, blob大小 Mysql中資料型態int, float, text, char, varchar, blob大小

[Mysql] 建立叢集式資料庫1/4 -- 安裝及設定DB1 使用galera建立Mysql的叢集式資料庫 (GALERA CLUSTER FOR MYSQL THE TRUE MULTI-MASTER)

[Mysql] 建立叢集式資料庫4/4--觀察及測試 觀察及測試haproxy+galera建立Mysql的叢集式資料庫,並進行壓力測試

[MySQL] FIND_IN_SET函數,把多筆條件判斷弄成字串 SQL 我們如果要查找某個欄位是否為某個值的時候,如果要判斷的條件很多,可以用這個函數

隨機好文

[Windows7] 移除IE10及移除IE11 Windows7 不得已的情況要移除IE11或IE10怎麼做?

[PHP] 檢查IP是否在某個網段內 mtachcidr 要檢查IP是否在某個網段內,要寫幾行?10行?5行? 不用,只要2行。以下是我寫的 code /** * matchCI

正則表達式:Email名稱防止連續輸入點(.)及下底線(_) Email的名稱中要允許特殊符號,但又不允許連續出現的正則表達式

「許功蓋」的字以及源由 有玩過電腦一段時間的人,都聽過這個人(有一天我才發現7年級的竟然都不認識這個

關閉瀏覽器表單的自動完成autocomplete 什麼是自動完成?就是當我們在網頁的輸入文字欄位中打入文字時,瀏覽器會把曾輸入過歷史記錄中找出來讓我們選擇。