簡體   English   中英

MySQL GROUP BY 子查詢中的功能依賴

[英]MySQL GROUP BY functional dependence in subquery

我正在編寫一個查詢來查找人員表中的重復行(包括每個重復行):

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 子句中,並且包含非聚合列“Person.firstName”,該列在功能上不依賴於 GROUP BY 子句中的列; 這與 sql_mode=only_full_group_by 不兼容

我不知道如何解決這個問題。 我嘗試將COUNT(*)更改為COUNT(CONCAT(firstName,lastName))但這沒有幫助。

奇怪的是 a) 它在 MariaDB 10.2 中運行良好,有或沒有 ONLY_FULL_GROUP_BY,並且 b) 單獨運行子查詢不會導致任何問題。

我究竟做錯了什么? 它幾乎看起來像是 MySQL 中的一個錯誤。

[編輯]:我當然很欣賞我的查詢的替代解決方案,但是我真的很想知道我的錯誤發生的原因。

像下面這樣嘗試它會做你嘗試過的同樣的事情

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

不合並字段:

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

或者使用 ANY_VALUE() 函數:

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

我會用存在邏輯編寫您的查詢:

SELECT p1.*
FROM Person p1
WHERE EXISTS (SELECT 1 FROM Person p2
              WHERE p2.firstName = p1.firstName AND
                    p2.lastName = p1.lastName AND
                    p2.id <> p1.id);

這實際上是說選擇每個我們可以找到另一個不同的人(通過主鍵id列,或者無論 PK 可能是什么),具有相同的名字和姓氏。

以下索引可能會加速上述查詢:

CREATE INDEX idx ON Person (lastName, firstName);

這應該允許存在查找快速評估。 請注意,在 InnoDB 上,MySQL 應通過將id添加到上述兩列索引的末尾來自動覆蓋id

關於您的錯誤,我不禁想知道問題是否在於您沒有在子查詢中使用正確的別名,導致 MySQL 認為您指的是外部查詢中的列。 試試這個版本:

SELECT p1.*
FROM Person p1
WHERE CONCAT(firstName, lastName) IN (
    SELECT CONCAT(p2.firstName, p2.lastName)
    FROM Person p2
    GROUP BY CONCAT(p2.firstName, p2.lastName)
    HAVING COUNT(*) > 1
);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM