与 sql_mode=only_full_group_by 不兼容的 MySQL 查询
Posted
技术标签:
【中文标题】与 sql_mode=only_full_group_by 不兼容的 MySQL 查询【英文标题】:Query with MySQL incompatible with sql_mode=only_full_group_by 【发布时间】:2020-02-29 17:41:21 【问题描述】:我的Query
有错误
1055 SELECT 列表的表达式 #2 不在 GROUP BY 子句中,并且 包含非聚合列“dms.HrAttLogsFormatted.ScanIn”,即 在功能上不依赖于 GROUP BY 子句中的列;这是 与 sql_mode=only_full_group_by 不兼容
查询:
SELECT
Employee.Id as Id,
Employee.FingerId as FingerId,
Employee.Name as Name,
Departement.Departement as Departement,
EmployeeShift.Shift as Shift,
ScanIn
FROM
HrEmployee as Employee
LEFT JOIN HrEmployeeShift as EmployeeShift
ON Employee.ShiftId = EmployeeShift.Id
LEFT JOIN CmDept as Departement
ON Employee.DeptId = Departement.Id
LEFT JOIN (
SELECT
TableEmployee.FingerId,
ScanIn
FROM
HrEmployee as TableEmployee,
HrAttLogsFormatted
WHERE
TableEmployee.FingerId = HrAttLogsFormatted.FingerId
AND DateIn = '2019-11-04'
GROUP BY HrAttLogsFormatted.FingerId
) AS HrJoinLogs
ON Employee.FingerId = HrJoinLogs.FingerId
WHERE
Employee.Status = 1
AND Employee.Flag = 1
AND Employee.ShiftId = 1
AND ScanIn is NULL
GROUP BY
Employee.Name
ORDER BY
Employee.Name ASC
有人有解决办法吗?
【问题讨论】:
你为什么要使用group by
?您的查询中没有聚合函数。
此查询中没有聚合,因此分组依据不合适 - 您要做什么。
附注:格式正确的查询更更容易理解。我格式化了您的查询,请考虑下次自己做。
【参考方案1】:
首先,阅读 mysql 的 notorious non-standard handling of GROUP BY. Here.
其次,您似乎正在使用GROUP BY
来消除结果集中的重复项。这个程序是有问题的。在我看来,当您的查询涉及其他人的钱时,这是不可接受的。您可能想改用SELECT DISTINCT
。但是,最好的办法是弄清楚这个查询的预期逻辑并重写它以更明确地传递该逻辑。
如果您仍然认为需要GROUP BY
,请查看查询工作时的结果集,然后再升级到更现代的 MySQL 版本。您将看到结果集的 ScanIn 列的所有行都是 NULL,因为您的查询显示 AND ScanIn IS NULL
。
因此,按 ScanIn 分组不会有任何影响。将, ScanIn
添加到两个GROUP BY
子句中。
【讨论】:
以上是关于与 sql_mode=only_full_group_by 不兼容的 MySQL 查询的主要内容,如果未能解决你的问题,请参考以下文章
MySQL的sql_mode解析与设置,sql文件导入报错解决
与 sql_mode=only_full_group_by 不兼容的 MySQL 查询
错误代码:1055 与 sql_mode=only_full_group_by 不兼容
sql_mode :(STRICT_TRANS_TABLES与STRICT_ALL_TABLES 区别)
执行查询时,我在 wampserver MySql 5.7.14 中遇到与 sql_mode=only_full_group_by 相关的错误