遇到问题
最近给公司某系统公众号端开发新功能,其中涉及到的一个功能点就是要分组查询每个强电井最新的一条记录,考虑到代码量和代码的复杂度,我直接使用了 MySQL 中的组内查询,在本地测试运行程序可行,但当部署到测试服务器时出现了异常,拉取测试服务器日志出现以下异常:
产生异常的原因就是所写组内查询引起的:
SELECT a.* FROM tbl_inspection_equipment_record a
RIGHT JOIN (
SELECT * FROM tbl_inspection_equipment_record
WHERE state = 1
AND build_id = ?
ORDER BY end_time DESC
) AS temp
ON a.id = temp.id
GROUP BY room_id
ORDER BY end_time DESC
问题原因
MySQL 5.7.5及以上功能依赖检测功能。如果启用了 ONLY_FULL_GROUP_BY SQL 模式(默认情况下),MySQL 将拒绝选择列表,HAVING 条件或 ORDER BY 列表的查询引用在 GROUP BY 子句中既未命名的非集合列,也不在功能上依赖于它们。(5.7.5之前,MySQL 没有检测到功能依赖关系,默认情况下不启用 ONLY_FULL_GROUP_BY。有关5.7.5之前的行为的说明,请参见“MySQL 5.6参考手册”。)
解决方案
方法一(该方式每次mysql服务重新启动恢复原来的模式)
1 执行sql语句
select @@global.sql_mode;
2 执行以下sql语句,去除步骤1中 ONLY_FULL_GROUP_BY
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';
方法二
1 远程服务器找到 my.cnf
文件
2 在该文件的底部加入以下内容:
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 重启mysql服务
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。