如何在only_full_group_by模式下编写合法SQL查询解决聚合报错
解决only_full_group_by模式下的聚合查询报错问题
报错原因是sql_mode=only_full_group_by的约束规则:在包含MAX、MIN这类聚合函数的查询中,SELECT列表里的非聚合列必须出现在GROUP BY子句中,或者通过函数与聚合列绑定,否则数据库无法确定要返回哪一行的非聚合列值。
根据你要获取对应最大original_id的created值的需求,可通过以下方法修正查询:
方法1:子查询匹配最大original_id
适用于所有MySQL版本,先找到最大的original_id,再查询对应记录的created值:
SELECT original_id, created FROM search_results WHERE original_id = (SELECT MAX(original_id) FROM search_results);
方法2:使用窗口函数(MySQL 8.0及以上版本)
通过窗口函数给记录按original_id降序排名,取排名第一的记录:
SELECT original_id, created FROM ( SELECT original_id, created, RANK() OVER(ORDER BY original_id DESC) AS rank_num FROM search_results ) ranked_results WHERE rank_num = 1;
- 若存在多条记录拥有相同的最大
original_id,RANK()会返回所有符合条件的记录; - 若只想返回其中一条,可替换为
ROW_NUMBER() OVER(ORDER BY original_id DESC, created DESC)(可根据实际需求调整排序字段)。
方法3:对created使用聚合函数(谨慎使用)
如果你仅需要created字段的最大值/最小值(而非对应最大original_id的那个值),可以给created也添加聚合函数:
SELECT MAX(original_id), MAX(created) FROM search_results;
注意:这种方法返回的MAX(created)可能和最大original_id不属于同一条记录,仅在你明确需要聚合后的created值时使用。
内容的提问来源于stack exchange,提问作者user2219963
相关产品推荐
相关产品推荐

