Mysql升級(jí)到5.7后遇到的group by查詢問題解決
發(fā)現(xiàn)問題
最近在將mysql升級(jí)到mysql 5.7后,進(jìn)行一些group by 查詢時(shí),比如下面的
SELECT *, count(id) as count FROM `news` GROUP BY `group_id` ORDER BY `inputtime` DESC LIMIT 20
就會(huì)報(bào)如下錯(cuò)誤:
SELECT list is not in GROUP BY clause and contains nonaggregated column ‘news.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by.
原因分析
原因是mysql 5.7 模式中。默認(rèn)啟用了ONLY_FULL_GROUP_BY。
ONLY_FULL_GROUP_BY是MySQL提供的一個(gè)sql_mode,通過這個(gè)sql_mode來提供SQL語句GROUP BY合法性的檢查。
http://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sqlmode_only_full_group_by
this is incompatible with sql_mode=only_full_group_by這句話提示了這違背了mysql的規(guī)則,only fully group by,也就是說在執(zhí)行的時(shí)候先分組,根據(jù)查詢的字段(select的字段)在分組的內(nèi)容中取出,所以查詢的字段全部都應(yīng)該在group by分組條件內(nèi);一種情況例外,查詢字段中如果含有聚合函數(shù)的字段不用包含在group by中,就像我上面的count(id)。
后來發(fā)現(xiàn)Order by排序條件的字段也必須要在group by內(nèi),排序的字段也是從分組的字段中取出。 不明白的可以去看一下。
解決辦法:
1.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';
去掉ONLY_FULL_GROUP_BY即可正常執(zhí)行sql.
2. 不去ONLY_FULL_GROUP_BY, 時(shí) select字段必須都在group by分組條件內(nèi)(含有函數(shù)的字段除外)。(如果遇到order by也出現(xiàn)這個(gè)問題,同理,order by字段也都要在group by內(nèi))。
3.利用ANY_VALUE()這個(gè)函數(shù) https://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html#function_any-value
This function is useful for GROUP BY queries when the ONLY_FULL_GROUP_BY SQL mode is enabled, for cases when MySQL rejects a query that you know is valid for reasons that MySQL cannot determine. The function return value and type are the same as the return value and type of its argument, but the function result is not checked for the ONLY_FULL_GROUP_BY SQL mode.
如上面的sql語句可寫成
SELECT ANY_VALUE(id)as id,ANY_VALUE(uid) as uid ,ANY_VALUE(username) as username,ANY_VALUE(title) as title,ANY_VALUE(author) as author,ANY_VALUE(thumb) as thumb,ANY_VALUE(description) as description,ANY_VALUE(content) as content,ANY_VALUE(linkurl) as linkurl,ANY_VALUE(url) as url,ANY_VALUE(group_id) as group_id,ANY_VALUE(inputtime) as inputtime, count(id) as count FROM `news` GROUP BY `group_id` ORDER BY ANY_VALUE(inputtime) DESC LIMIT 20
我選用的是第3種方法。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
Mysql官方性能測(cè)試工具mysqlslap的使用簡(jiǎn)介
mysqlslap隨著MySQL安裝的時(shí)候就自動(dòng)安裝好了,而且 mysqlslap 把很多的自定義測(cè)試的功能封裝到了外部,使用者只需要在外部提供 SQL 語句的腳本就可以自定義測(cè)試語句,本文將簡(jiǎn)單介紹該工具的使用2021-05-05
idea中使用mysql的保姆級(jí)教程(超詳細(xì))
我們開發(fā)時(shí)經(jīng)常需要用到一些客戶端去訪問數(shù)據(jù)庫查詢、更新數(shù)據(jù)等操作,下面這篇文章主要給大家介紹了關(guān)于idea中使用mysql的保姆級(jí)教程,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-04-04
利用Sqoop實(shí)現(xiàn)MySQL數(shù)據(jù)導(dǎo)入Hive的全流程
在大數(shù)據(jù)領(lǐng)域中,MySQL 和 Hive 是兩種常見的存儲(chǔ)工具,MySQL 適合事務(wù)處理,而 Hive 則是用于離線數(shù)據(jù)分析的利器,本文將全面講解如何使用 Sqoop 將 MySQL 數(shù)據(jù)導(dǎo)入 Hive 的完整流程,包括環(huán)境配置、具體操作步驟以及最佳實(shí)踐和常見問題解決方案,需要的朋友可以參考下2024-12-12
MySQL InnoDB引擎ibdata文件損壞/刪除后使用frm和ibd文件恢復(fù)數(shù)據(jù)
mysql的ibdata文件被誤刪、被惡意修改,沒有從庫和備份數(shù)據(jù)的情況下的數(shù)據(jù)恢復(fù),不能保證數(shù)據(jù)庫所有表數(shù)據(jù)的100%恢復(fù),目的是盡可能多的恢復(fù),下面是具體的操作方法2025-03-03
mysql 有關(guān)“InnoDB Error ib_logfile0 of different size”錯(cuò)誤
mysql 有關(guān)“InnoDB Error ib_logfile0 of different size”錯(cuò)誤的解決方法,需要的朋友可以參考下。2011-06-06
MySQL中USING 和 HAVING 用法實(shí)例簡(jiǎn)析
這篇文章主要介紹了MySQL中USING 和 HAVING 用法,結(jié)合實(shí)例形式簡(jiǎn)單分析了mysql中USING 和 HAVING的功能、使用方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2019-08-08

