首页 > 解决方案 > MySQL GROUP BY 子查询中的功能依赖

问题描述

我正在编写一个查询来查找人员表中的重复行(包括每个重复行):

SELECT *
FROM Person
WHERE CONCAT(firstName,lastName) IN (
    SELECT CONCAT(firstName,lastName) AS name
    FROM Person
    GROUP BY CONCAT(firstName,lastName)
    HAVING COUNT(*) > 1
)

在启用了 ONLY_FULL_GROUP_BY 的 MySQL 8.0.19 中运行它时,它会失败并出现以下错误:

查询 1 错误:HAVING 子句的表达式 #1 不在 GROUP BY 子句中,并且包含在功能上不依赖于 GROUP BY 子句中的列的非聚合列“Person.firstName”;这与 sql_mode=only_full_group_by 不兼容

我不知道如何解决这个问题。我试图改变COUNT(*)COUNT(CONCAT(firstName,lastName))但没有帮助。

奇怪的是 a) 它在 MariaDB 10.2 中运行良好,有或没有 ONLY_FULL_GROUP_BY,并且 b) 单独运行子查询不会导致任何问题。

我究竟做错了什么?它几乎看起来像是 MySQL 中的一个错误。

[编辑]:我当然很欣赏我的查询的替代解决方案,但是我真的很想回答为什么我的错误会发生。

标签: mysql

解决方案


像下面这样尝试它会和你尝试的一样

SELECT *
FROM Person
WHERE (firstName,lastName) IN (
    SELECT firstName,lastName
    FROM Person
    GROUP BY firstName,lastName
    HAVING COUNT(*) > 1
)

推荐阅读