我有两列可用作用户唯一身份:例如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和电子邮件信息)。
答案 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)