MySQL报错Error Code 1055与sql_mode=only_full_group_by不兼容如何修复?
报错原因
Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'ebe.Co.ContactName' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
这个报错是MySQL的only_full_group_by校验规则触发的,规则要求:SELECT列表中所有没有用聚合函数包裹的字段,必须全部包含在GROUP BY子句中。你当前的代码只按E.ClientID分组,但是SELECT里的C.ClientName、CO.ContactName、CO.ContactPhone、CO.ContactEmail都属于非聚合字段,也没有加入GROUP BY,所以触发报错。
修改方案
你可以根据自己的统计需求二选一:
方案1:按【客户+对应联系人】维度统计(逻辑更严谨,推荐使用)
如果你的统计目标是每个客户的每个联系人对应的事件总数,直接把所有非聚合字段加入GROUP BY即可:
USE EBE; SELECT C.ClientName, CO.ContactName, CO.ContactPhone, CO.ContactEmail, COUNT(E.EventCode) AS NumberOfEvents FROM Client AS C INNER JOIN Contact AS CO ON C.ClientID = CO.ClientID INNER JOIN Events AS E ON C.ClientID = E.ClientID GROUP BY C.ClientName, CO.ContactName, CO.ContactPhone, CO.ContactEmail ORDER BY C.ClientName;
如果Client表中ClientID和ClientName是一一对应关系、Contact表中ContactID和三个联系人字段是一一对应关系,也可以简化GROUP BY为GROUP BY C.ClientID, CO.ContactID,前提是这两个ID是对应表的主键。
方案2:仅按客户维度统计,联系人信息取任意一条
如果你只需要统计每个客户的事件总数,同一个客户的多个联系人信息随便取一条即可,可以对联系人字段用ANY_VALUE()函数包裹,规避校验:
USE EBE; SELECT C.ClientName, ANY_VALUE(CO.ContactName) AS ContactName, ANY_VALUE(CO.ContactPhone) AS ContactPhone, ANY_VALUE(CO.ContactEmail) AS ContactEmail, COUNT(E.EventCode) AS NumberOfEvents FROM Client AS C INNER JOIN Contact AS CO ON C.ClientID = CO.ClientID INNER JOIN Events AS E ON C.ClientID = E.ClientID GROUP BY C.ClientID, C.ClientName ORDER BY C.ClientName;
内容的提问来源于stack exchange,提问作者Go_Gators

