mysql不支持group by的解決方法小結(jié)
下載安裝的是最新版的mysql5.7.x版本,默認(rèn)是開(kāi)啟了 only_full_group_by 模式的,但開(kāi)啟這個(gè)模式后,原先的 group by 語(yǔ)句就報(bào)錯(cuò),然后又把它移除了。
一旦開(kāi)啟 only_full_group_by ,感覺(jué),group by 將變成和 distinct 一樣,只能獲取受到其影響的字段信息,無(wú)法和其他未受其影響的字段共存,這樣,group by 的功能將變得十分狹窄了
only_full_group_by 模式開(kāi)啟比較好。
因?yàn)樵?mysql 中有一個(gè)函數(shù): any_value(field) 允許,非分組字段的出現(xiàn)(和關(guān)閉 only_full_group_by 模式有相同效果)。
具體出錯(cuò)提示:
[Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated column 'information_schema.PROFILING.SEQ' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
1.1. 1、查看sql_mode
select @@global.sql_mode;
1.2. 查詢出來(lái)的值為:
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
2、去掉ONLY_FULL_GROUP_BY,重新設(shè)置值。
select @@global.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';
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';
2.1. 3、上面是改變了全局sql_mode,對(duì)于新建的數(shù)據(jù)庫(kù)有效。對(duì)于已存在的數(shù)據(jù)庫(kù),則需要在對(duì)應(yīng)的數(shù)據(jù)下執(zhí)行:
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';
解決辦法大致有兩種:
一:在sql查詢語(yǔ)句中不需要group by的字段上使用any_value()函數(shù)
這種對(duì)于已經(jīng)開(kāi)發(fā)了不少功能的項(xiàng)目不太合適,畢竟要把原來(lái)的sql都給修改一遍
3.1.
二:修改my.cnf(windows下是my.ini)配置文件,刪掉only_full_group_by這一項(xiàng)
若我們項(xiàng)目的mysql安裝在ubuntu上面,找到這個(gè)文件打開(kāi)一看,里面并沒(méi)有sql_mode這一配置項(xiàng),想刪都沒(méi)得刪。
當(dāng)然,還有別的辦法,打開(kāi)mysql命令行,執(zhí)行命令
select @@sql_mode;
這樣就可以查出sql_mode的值,復(fù)制這個(gè)值,在my.cnf中添加配置項(xiàng)(把查詢到的值刪掉only_full_group_by這個(gè)選項(xiàng),其他的都復(fù)制過(guò)去):
sql_mode=STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION;
如果 [mysqld] 這行被注釋掉的話記得要打開(kāi)注釋。然后重重啟mysql服務(wù)
注:使用命令
set sql_mode=STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
這樣可以修改一個(gè)會(huì)話中的配置項(xiàng),在其他會(huì)話中是不生效的?!?nbsp;
如果上面的不夠清楚可以參考下面的語(yǔ)句
進(jìn)入mysql命令行 執(zhí)行如下兩句語(yǔ)句
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'; set session sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
但是當(dāng)重啟mysql 問(wèn)題又會(huì)復(fù)現(xiàn)
找到my.cnf,編輯它~把以下命令放到合適位置,重啟mysql 服務(wù),OK~報(bào)錯(cuò)沒(méi)啦~
[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
注意 sql_model那句話 一定要放在[mysqld] 內(nèi)容區(qū)域
mysql5.7不支持group by的解決辦法
1、查看sql_mode
select @@global.sql_mode
查詢出來(lái)的值為:
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
2、去掉ONLY_FULL_GROUP_BY,重新設(shè)置值。
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';
linux 下mysql5.7+使用group by、order by報(bào)錯(cuò)ONLY_FULL_GROUP_BY不修改配置文件
1.進(jìn)入mysql
2.查詢出sql_mode:
SELECT @@GLOBAL.sql_mode;
SELECT @@SESSION.sql_mode;
SELECT @@sql_mode;
發(fā)現(xiàn)前面都有ONLY_FULL_GROUP_BY
3. 在命令行中輸入
set @@GLOBAL.sql_mode=(select replace(@@GLOBAL.sql_mode,‘ONLY_FULL_GROUP_BY',''));
以上三個(gè)sql_home都設(shè)置一遍,
4.退出mysql重新進(jìn)入查看sql_mode;
到這里基本上就差不多了。
相關(guān)文章
Mysql實(shí)現(xiàn)遞歸樹(shù)查詢的使用示例
Mysql我們可以使用遞歸查詢來(lái)構(gòu)建一個(gè)遞歸樹(shù),本文就來(lái)介紹一下Mysql實(shí)現(xiàn)遞歸樹(shù)查詢的使用示例,具有一定的參考價(jià)值,感興趣的可以了解一下2023-10-10MySQL中rank() over、dense_rank() over、row_number()&n
本文主要介紹了MySQL中rank() over、dense_rank() over、row_number() over用法介紹,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03新手把mysql裝進(jìn)docker中碰到的各種問(wèn)題
這篇文章主要給大家介紹了新手第一次把mysql裝進(jìn)docker中可能碰到的各種問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用mysql具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06CentOS6.9+Mysql5.7.18源碼安裝詳細(xì)教程
CentOS6.9+Mysql5.7.18源碼安裝,以下操作均在root用戶下執(zhí)行。下面通過(guò)本教程給大家詳細(xì)介紹CentOS6.9+Mysql5.7.18源碼安裝方法,需要的的朋友參考下吧2017-06-06在MySQL中同時(shí)查找兩張表中的數(shù)據(jù)的示例
這篇文章主要介紹了在MySQL中同時(shí)查找兩張表中的數(shù)據(jù)的示例,即一次查詢操作返回兩張表的結(jié)果,需要的朋友可以參考下2015-07-07MySQL將CSV文件快速導(dǎo)入MySQL中的實(shí)現(xiàn)
本文主要介紹了MySQL將CSV文件快速導(dǎo)入MySQL中的實(shí)現(xiàn),主要包括navicat、workbench等軟件中的導(dǎo)入向?qū)謩?dòng)導(dǎo)入或使用load data infile命令導(dǎo)入,感興趣的可以了解一下2023-11-11mysql數(shù)據(jù)庫(kù)sql優(yōu)化原則(經(jīng)驗(yàn)總結(jié))
這里的原則 只是針對(duì)mysql數(shù)據(jù)庫(kù),其他的數(shù)據(jù)庫(kù) 某些是殊途同歸,某些還是存在差異。我總結(jié)的也是mysql普遍的規(guī)則,對(duì)于某些特殊情況得特殊對(duì)待。在構(gòu)造sql語(yǔ)句的時(shí)候養(yǎng)成良好的習(xí)慣2014-03-03