這篇文章主要為大家介紹了關於Mysql升級到5.7後遇到的group by查詢問題的解決方法,文中透過範例程式碼介紹的非常詳細,對同樣遇到這個問題的朋友們具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。
發現問題
最近在將mysql升級到mysql 5.7後,進行一些group by 查詢時,例如下面的
SELECT *, count(id) as count FROM `news` GROUP BY `group_id` ORDER BY `inputtime` DESC LIMIT 20
就會報如下錯誤:
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 模式中。預設啟用了ONLY_FULL_GROUP_BY。
ONLY_FULL_GROUP_BY是MySQL提供的一個sql_mode,透過這個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
##this is incompatible with sql_mode=only_full_group_by##😢這句話提示了這違反了mysql的規則,only fully group by,也就是說在執行的時候先分組,根據查詢的字段(select的字段)在分組的內容中取出,所以查詢的字段全部都應該在group by分組條件內;一種情況例外,查詢欄位中如果含有聚合函數的欄位不用包含在group by中,就像我上面的count(id)一樣。
後來發現Order by排序條件的欄位也必須要在group by內,排序的欄位也是從分組的欄位中取出。 不明白的可以去看一下。 ############ 解決方案:############1.###set@@sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_pISION_BY_ZERO,NO_AUTO_ZERO_DATE,NOSU_FOR_pISION_BY_ZERO,NO_AUTO_ZERO_DATE,NOSU_FOR. ;#########去掉ONLY_FULL_GROUP_BY即可正常執行sql.######2. 不去ONLY_FULL_GROUP_BY, 時select欄位必須都在group by分組條件內(含函數的欄位除外)。 (如果遇到order by也出現這個問題,同理,order by欄位也都要在group by內)。 ######3.利用###ANY_VALUE()###這個函數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 My SQL can return value. value and type of its argument, but the function result is not checked for the ONLY_FULL_GROUP_BY SQL mode.######如上面的sql語句可寫成############選用的是第3種方法。 ############總結##########以上是Mysql5.7出現group by查詢問題的解決方法分享的詳細內容。更多資訊請關注PHP中文網其他相關文章!