LEFT JOIN多表分组查询触发#1055错误,求解决方案
解决MySQL GROUP BY报错 #1055的方案
错误原因
你遇到的#1055错误是因为MySQL开启了sql_mode=only_full_group_by模式,该模式要求:SELECT列表中的所有非聚合(未用SUM/MAX等函数包裹)的列,必须出现在GROUP BY子句中,或者与GROUP BY中的列存在函数依赖关系。
你的原SQL中,GROUP BY u.id,但SELECT里的p.id既不在GROUP BY里,又不与u.id函数依赖(一个users可能对应多个pupils记录),因此触发错误。
解决方案
根据你的业务需求,选择以下两种修改方式之一:
1. 若一个用户对应多个学生:用聚合函数处理p.id
如果一个用户可能有多个关联的学生记录,你需要明确如何选取p.id(比如取最大/最小ID),用聚合函数包裹p.id:
SELECT u.id, u.name, u.surname, MAX(p.id) as p_id, SUM(t.summa) FROM users u LEFT JOIN pupils p ON p.userid = u.id LEFT JOIN tulovlar t ON t.pupilid = p.id WHERE u.turi = 3 GROUP BY u.id, u.name, u.surname ORDER BY u.surname
注:由于u.id是users表的主键,u.name和u.surname天然依赖于u.id,部分MySQL版本允许只写GROUP BY u.id,但加上u.name, u.surname能提升兼容性。
2. 若一个用户仅对应一个学生:将p.id加入GROUP BY
如果pupils.userid是唯一键(每个用户仅对应一个学生),可以直接把p.id加入GROUP BY子句:
SELECT u.id, u.name, u.surname, p.id as p_id, SUM(t.summa) FROM users u LEFT JOIN pupils p ON p.userid = u.id LEFT JOIN tulovlar t ON t.pupilid = p.id WHERE u.turi = 3 GROUP BY u.id, u.name, u.surname, p.id ORDER BY u.surname
内容的提问来源于stack exchange,提问作者Zokhid Juraev
相关产品推荐
相关产品推荐

