MYSQL升级5.7.10后GROUP BY语句出错解决方法
最近由于重新部署網站,服務器配置成apache2.4,php5.6,mysql5.7,但運行網站時發現有一些報錯。
其中有一條是:#1055 - Expression #3 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'cash.sdb_login_log.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
SQL語句如下:
SELECT * FROM `sdb_login_log` group by ip
表結構:
CREATE TABLE `sdb_login_log` (
`id` int(10) NOT NULL AUTO_INCREMENT,
`group_level` int(11) NOT NULL,
`uid` int(11) NOT NULL,
`username` varchar(50) NOT NULL,
`ip` char(15) NOT NULL,
`last_login` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM;
字面意思理解是sql_model=only_full_group_by限制了,導致在以往MYSQL版本中能正常查詢的SQL,在5.7不能用了
參考文檔:
http://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sql-mode-setting
文檔指出:ONLY_FULL_GROUP_BY的設定,將不允許查詢字段包括非聚集列
查詢mysql服務器版本:
select @@version
顯示:
5.7.10
select @@GLOBAL.sql_mode;
顯示結果:
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
#查看sql_mode的語法
select @@GLOBAL.sql_mode;
select @@SESSION.sql_mode;
#修改sql_mode的語法
SET GLOBAL sql_mode = 'modes';
SET SESSION sql_mode = 'modes';
或者 set sql_model='';
解決方法
經過使用修改sql_mode測試,發現可以在不修改sql的情況下,不再報錯了。
SET sql_mode = '';
SELECT * FROM `sdb_login_log` group by ip;
如果不想修改sql_mode的話,但還是要輸出表的所有 字段,可以修改sql達到。
方法1(返回結果同上SQL)
SELECT ip,max(id) id,max(group_level) group_level,max(uid) uid,max(username) username,max(last_login)? last_login FROM `sdb_login_log` group by ip;
方法2(返回結果和上SQL不同):
SELECT ip,id,group_level,uid,username,last_login FROM `sdb_login_log` group by ip,id,group_level,uid,username,last_login;
方法2的返回結果不一樣,所以 不能采用。
升級MYSQL5.7是為了更好的性能,據我猜測,MYSQL5.7對sql_mode的限制,也是為了更好的查詢性能。所以如果在開發階段,如果要使用mysql5.7版本建議大家閱讀一下5.7的文檔,然后將自己的sql寫的更嚴謹,盡量少用select * ,只查出自己想要的數據列即可。
由于 我的程序邏輯上只要不同的ip,和最后登錄時間,所以 我的SQL改成以下:
SELECT ip,max(last_login)? last_login FROM `sdb_login_log` group by ip;
總結
以上是生活随笔為你收集整理的MYSQL升级5.7.10后GROUP BY语句出错解决方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySQL主键唯一键重复插入解决方法
- 下一篇: springboot+mybatis多数