SQL语句报错#1055:GROUP BY子句不符合only_full_group_by模式求助
修正后的SQL语句及问题说明
原SQL存在的问题
- 表关联逻辑错误:
entries.dog_id = breeds.id应关联dogs.id,breeds.id = dogs.breed_id应改为dogs.breed_id = breeds.id,原关联把狗和品种的对应关系搞反了。 - 分组对象错误:需求是统计每只狗的参赛数据,应按狗的唯一标识(如
dogs.id)分组,而非按品种分组,否则会将同品种的所有狗合并统计,无法得到单只狗的结果。 - 违反
only_full_group_by模式:SELECT列表中的非聚合字段(如dogs.name、breeds.name)必须出现在GROUP BY子句中,或依赖于GROUP BY中的唯一字段(主键)。 - 冗余且错误的子查询/分组:子查询的
order by count和外层的group by breed都是多余操作,完全不符合需求逻辑。
修正后的SQL
SELECT d.name AS 狗名, b.name AS 品种, AVG(e.score) AS 平均得分 FROM entries e JOIN dogs d ON e.dog_id = d.id JOIN breeds b ON d.breed_id = b.id GROUP BY d.id, d.name, b.name -- 按狗的唯一ID及相关非聚合字段分组,满足only_full_group_by要求 HAVING COUNT(e.id) >= 2 -- 筛选参赛次数超过1次的狗 ORDER BY 平均得分 DESC -- 按平均得分降序排序 LIMIT 10; -- 取前十条结果
说明
- 修正了表关联关系,确保赛事条目正确关联到对应狗只,再关联到狗的品种。
- 按狗的唯一ID(
d.id)分组,同时将d.name和b.name加入GROUP BY,兼容only_full_group_by模式(若数据库支持主键依赖,仅按d.id分组即可,显式列出适配性更强)。 - 使用
HAVING子句筛选参赛次数≥2的记录(COUNT(e.id)统计该狗的参赛次数)。 - 按平均得分降序排序后,用
LIMIT 10获取平均得分最高的前十只狗。
内容的提问来源于stack exchange,提问作者Ich Bin's
相关产品推荐
相关产品推荐

