GROUP BY на один столбец или другой (переходное отношение) - PullRequest
0 голосов
/ 14 июня 2019

У меня есть два столбца, которые могут использоваться в качестве уникальных идентификаторов пользователя: например, 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

Поскольку идентификаторы # 1, # 2 и # 3 являются одним и тем же пользователем, на основе SSN и информации электронной почты.

1 Ответ

1 голос
/ 15 июня 2019

Используйте JOIN, чтобы получить SSN из другой строки с тем же адресом электронной почты, когда 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

...