MySQL 5.7执行GROUP BY查询报错且无法修改sql_mode的解决办法
解决
only_full_group_by模式下的GROUP BY报错(无需修改sql_mode) 遇到这个报错太正常了——MySQL的only_full_group_by模式严格遵守SQL标准,要求SELECT列表里的非聚合列必须要么出现在GROUP BY子句里,要么和GROUP BY的列存在功能依赖(比如主键和其他列的关系)。既然不能调整sql_mode,咱们可以用下面几种方法修复:
方法1:用聚合函数处理非GROUP BY列
如果你的需求是获取每个category对应的任意一个title,或者把同category下的所有title合并起来,直接用聚合函数包裹titleen就行。常见的聚合函数有这些:
- 取任意一个title:
MIN(titleen)、MAX(titleen) - 合并所有title为一个字符串:
GROUP_CONCAT(titleen SEPARATOR ', ')
示例SQL:
SELECT caten as category, MAX(titleen) as title -- 可替换为MIN/GROUP_CONCAT,按需选择 FROM pages WHERE pshow = 1 GROUP BY caten ASC;
方法2:子查询+关联获取指定行
如果你需要每个category对应的特定行的title(比如最新发布的、id最小的),可以先通过子查询拿到每个category的唯一标识(比如最小id),再关联原表获取对应的titleen。
示例SQL(假设id是表的主键,取每个category下id最小的行的title):
SELECT p.caten as category, p.titleen as title FROM pages p INNER JOIN ( SELECT caten, MIN(id) as min_id FROM pages WHERE pshow = 1 GROUP BY caten ASC ) t ON p.id = t.min_id AND p.caten = t.caten WHERE p.pshow = 1;
方法3:用窗口函数(MySQL 8.0及以上版本)
如果你的MySQL版本是8.0+,窗口函数是更灵活的选择。比如用ROW_NUMBER()给每个category下的行编号,然后取编号为1的行(可以自定义排序规则,比如按id降序取最新的)。
示例SQL(取每个category下id最大的行的title):
SELECT category, title FROM ( SELECT caten as category, titleen as title, ROW_NUMBER() OVER (PARTITION BY caten ORDER BY id DESC) as rn FROM pages WHERE pshow = 1 ) t WHERE rn = 1 ORDER BY category ASC;
你可以根据自己的实际业务需求,从这几种方法里选最适合的~
内容的提问来源于stack exchange,提问作者Lilit Tarposhian
相关产品推荐
相关产品推荐

