You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:55:23