? ? ? ? Mysql 升級(jí)到5.7之后sql_mode默認(rèn)開啟only_full_group_by,這時(shí)進(jìn)行一些group by查詢的時(shí)候就會(huì)報(bào)以下錯(cuò)誤:
原因是Mysql5.7模式中,默認(rèn)啟用了only_full_group_by。
ONLY_FULL_GROUP_BY是MySQL提供的一個(gè)sql_mode捶障,通過這個(gè)sql_mode來提供SQL語句GROUP BY合法性的檢查僧须。
官網(wǎng)給的解答,英語比較好的同學(xué)可以直接看官網(wǎng):
https://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sqlmode_only_full_group_by
英語不好的同學(xué)接著往下看:
? ? ? ? this is incompatible with sql_mode=only_full_group_by這句話提示了這違背了mysql的規(guī)則项炼,only_full_group_by担平,也就是說在執(zhí)行的時(shí)候先分組,根據(jù)查詢的字段(select的字段)在分組的內(nèi)容中取出锭部,所以查詢的字段全部都應(yīng)該在group by分組條件內(nèi)暂论;一種情況例外,查詢字段中如果含有聚合函數(shù)的字段不用包含在group by中拌禾,就像我上面的count(openid)取胎。后來發(fā)現(xiàn)Order by排序條件的字段也必須要在group by內(nèi),排序的字段也是從分組的字段中取出湃窍。 不明白的可以去看一下闻蛀。
解決方法:
? ? ? ?1. 首先查看sql_mode: ?SELECT @@sql_mode;
? ? ? 用命令更新mysql的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’;
2.注意第1種修改,重啟mysql后就會(huì)失效,如果想長久生效您市,就需要在mysql的配置文件 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;?
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語句修改成 :
與時(shí)俱進(jìn),我推薦大家用第三種方法.