GROUP BY一列或另一列(传递关系)

时间:2019-06-14 20:43:48

标签: mysql group-by mariadb

我有两列可用作用户唯一身份:例如SSN和电子邮件。我需要GROUP BY可以通过此列之一进行统一的所有用户。

id  | name      | ssn     | email
1     John        123       john@test.com
2     Doe         123       john.doe@test.com
3     Mr          NULL      john.doe@test.com

以上所有行基本上都是针对同一用户的。 ID#1和#2具有相同的ssn列。 ID#2和#3具有相同的email。因此ID#1和#3是相同的。传递关系。

如果我使用类似GROUP BY ssn, email之类的东西,则实际上将无法工作。

我期望的是:

假设我做了类似的事情:

SELECT 
    GROUP_CONCAT(users.id) AS ids,
    GROUP_CONCAT(DISTINCT users.email) AS emails_used_by_user
FROM users

GROUP BY TRANSITIVE(ssn, email) # Example

它将返回单行,例如:

ids   | emails_used_by_user
1,2,3   john@test.com,john.doe@test.com

由于ID#1,#2和#3是同一用户(基于SSN和电子邮件信息)。

1 个答案:

答案 0 :(得分:1)

当SSN为空时,使用JOIN从具有相同电子邮件的另一行获取SSN。

SELECT GROUP_CONCAT(DISTINCT u1.id) AS ids, 
        GROUP_CONCAT(DISTINCT u1.email) AS emails
FROM users AS u1
LEFT JOIN users AS u2 ON u1.ssn IS NULL AND u1.email = u2.email AND u1.id != u2.id
GROUP BY IFNULL(u1.ssn, u2.ssn)

DEMO