天天看點

sql查詢使用group分組時出現sql_mode=only_full_group_by

在使用mysql group分組時 出現sql_mode=only_full_group_by 錯誤

查了網上 都是說 設定sql_mode值

在配置檔案中修改

windows 在安裝目錄下的my.ini 檔案

Mac 或者Linux 在/ etc/my.cnf

在[mysqld]下面添加這段

sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

那麼設定這段到底是什麼意思呢?

各項的含義如下:

STRICT_TRANS_TABLES:

在該模式下,如果一個值不能插入到一個事務表中,則中斷目前的操作,對非事務表不做限制。必須設定,以後各項可能依賴于該項的設定

NO_ENGINE_SUBSTITUTION:

如果需要的存儲引擎被禁用或未編譯,那麼抛出錯誤。不設定此值時,用預設的存儲引擎替代,并抛出一個異常

ONLY_FULL_GROUP_BY:

對于GROUP BY操作,如果在SELECT中出現的單獨的列,沒有在GROUP BY子句中出現,那麼這個SQL是不合法的

NO_AUTO_VALUE_ON_ZERO:

該值影響自增長列的插入。預設設定下,插入0或NULL代表生成下一個自增長值。如果使用者希望插入的值為0,而該列又是自增長的,那麼這個選項就有用了

NO_ZERO_IN_DATE:

在嚴格模式下,不允許日期和月份為零

NO_ZERO_DATE:

設定該值,mysql資料庫不允許插入零日期,插入零日期會抛出錯誤而不是警告

ERROR_FOR_DIVISION_BY_ZERO:

在INSERT或UPDATE過程中,如果資料被零除,則産生錯誤而非警告。如果未給出該模式,那麼資料被零除時MySQL傳回NULL

NO_AUTO_CREATE_USER:

禁止GRANT語句建立密碼為空的使用者

PIPES_AS_CONCAT:

将“||”視為字元串的連接配接操作符而非或運算符,這和Oracle資料庫是一樣的,也和字元串的拼接函數Concat相類似

ANSI_QUOTES:

啟用ANSI_QUOTES後,不能用雙引号來引用字元串,因為它被解釋為識别符

其中ONLY_FULL_GROUP_BY錯誤 主要是在select後得字段未在group by 子句中出現

也就是說是咱寫得sql有問題,而不是配置檔案得原因,既然有這個限制 那麼就證明 尤其存在意義,配置檔案盡可能得不去修改(當然僅針對我這種小白)。

那麼既然知道是我們SQL得問題 我們就需要去修改自己得sql 可嘗試在gourp by 子句後添加要查詢得字段

例如:

select count(id),typeValue,typeName from dev group by typeValue
           

那麼隻需要在 後面添加 typeName字段即可

select count(id),typeValue,typeName from dev group by typeValue,typeName
           

如果不能執行,那麼就需要自己好好審讀自己得sql,如果着急 可先使用上面得配置方案解決,後續有時間再更改。