【问题标题】:Query with MySQL incompatible with sql_mode=only_full_group_by与 sql_mode=only_full_group_by 不兼容的 MySQL 查询
【发布时间】: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?您的查询中没有聚合函数。
  • 此查询中没有聚合,因此分组依据不合适 - 您要做什么。
  • 附注:格式正确的查询更容易理解。我格式化了您的查询,请考虑下次自己做。

标签: mysql


【解决方案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 子句中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-12
    • 2018-04-13
    • 2016-07-12
    相关资源
    最近更新 更多