消除 GROUP_CONCAT 中的重复行
Eliminate duplicate rows inside GROUP_CONCAT
我有使用此 sql 的重复记录:
SELECT emp.id, first_name, second_name, last_name, department, positions,
GROUP_CONCAT(email, " ", email_type SEPARATOR " || ") AS mails,
GROUP_CONCAT(number, " ", number_type SEPARATOR " || ") AS numbers
FROM geography.employee AS emp
INNER JOIN geography.employee_email AS ee ON emp.id = ee.email_FK
LEFT JOIN geography.employee_number AS en ON emp.id = en.number_FK
WHERE first_name = 'John' AND last_name = 'Ausini'
GROUP BY emp.id
所以我得到了这些邮件结果:
heyhey@abv.bg personal || heyhey@abv.bg personal || summer_geals@bwtc.co work || summer_geals@bwtc.co work || ivanov@abv.bg personal || ivanov@abv.bg personal
对于数字:
+7654656656565 work || +7654656465655 personal || +7654656656565 work || +7654656465655 personal || +7654656656565 work || +7654656465655 personal
奇怪的是,在我的第二条记录中,邮件没有重复,邮件:
hei@abv.bg personal || hurei@abv.bg personal || burei@abv.bg personal || work@bwtc.com work
...但是在这个记录中我没有数字,也许这与顶部的记录有所不同。
我的预期输出不是重复每条记录的数据(对于第一个记录示例):
heyhey@abv.bg personal || summer_geals@bwtc.co work || ivanov@abv.bg personal
...而且数字也没有重复。
DISTINCT 也不起作用(如果我把它放在 SELECT 之后),我试过了,虽然我不喜欢掩盖问题。
我在表中的数据:
MySQL GROUP_CONCAT
允许您指定 DISTINCT
应该在连接之前消除重复项:
SELECT
emp.id, first_name, second_name, last_name, department, positions,
GROUP_CONCAT(DISTINCT email, " ", email_type SEPARATOR " || ") AS mails,
GROUP_CONCAT(DISTINCT number, " ", number_type SEPARATOR " || ") AS numbers
FROM geography.employee AS emp
INNER JOIN geography.employee_email AS ee ON emp.id = ee.email_FK
LEFT JOIN geography.employee_number AS en ON emp.id = en.number_FK
WHERE first_name = 'John' AND last_name = 'Ausini'
GROUP BY emp.id
由于您只能获取单个用户的信息,因此我会接受 Salman A 的回答;但如果您要面向多个(或所有)用户,并且用户往往有很多电子邮件和号码,则此版本 可能 更快。
SELECT emp.id, first_name, second_name, last_name, department, positions, ee.mails, en.numbers
FROM geography.employee AS emp
INNER JOIN (SELECT email_FK, GROUP_CONCAT(email, " ", email_type SEPARATOR " || ") AS mails
FROM geography.employee_email
GROUP BY email_FK
) AS ee ON emp.id = ee.email_FK
LEFT JOIN (SELECT number_FK, GROUP_CONCAT(number, " ", number_type SEPARATOR " || ") AS numbers
FROM geography.employee_number
GROUP BY number_FK
) AS en ON emp.id = en.number_FK
;
我有使用此 sql 的重复记录:
SELECT emp.id, first_name, second_name, last_name, department, positions,
GROUP_CONCAT(email, " ", email_type SEPARATOR " || ") AS mails,
GROUP_CONCAT(number, " ", number_type SEPARATOR " || ") AS numbers
FROM geography.employee AS emp
INNER JOIN geography.employee_email AS ee ON emp.id = ee.email_FK
LEFT JOIN geography.employee_number AS en ON emp.id = en.number_FK
WHERE first_name = 'John' AND last_name = 'Ausini'
GROUP BY emp.id
所以我得到了这些邮件结果:
heyhey@abv.bg personal || heyhey@abv.bg personal || summer_geals@bwtc.co work || summer_geals@bwtc.co work || ivanov@abv.bg personal || ivanov@abv.bg personal
对于数字:
+7654656656565 work || +7654656465655 personal || +7654656656565 work || +7654656465655 personal || +7654656656565 work || +7654656465655 personal
奇怪的是,在我的第二条记录中,邮件没有重复,邮件:
hei@abv.bg personal || hurei@abv.bg personal || burei@abv.bg personal || work@bwtc.com work
...但是在这个记录中我没有数字,也许这与顶部的记录有所不同。 我的预期输出不是重复每条记录的数据(对于第一个记录示例):
heyhey@abv.bg personal || summer_geals@bwtc.co work || ivanov@abv.bg personal
...而且数字也没有重复。 DISTINCT 也不起作用(如果我把它放在 SELECT 之后),我试过了,虽然我不喜欢掩盖问题。
我在表中的数据:
MySQL GROUP_CONCAT
允许您指定 DISTINCT
应该在连接之前消除重复项:
SELECT
emp.id, first_name, second_name, last_name, department, positions,
GROUP_CONCAT(DISTINCT email, " ", email_type SEPARATOR " || ") AS mails,
GROUP_CONCAT(DISTINCT number, " ", number_type SEPARATOR " || ") AS numbers
FROM geography.employee AS emp
INNER JOIN geography.employee_email AS ee ON emp.id = ee.email_FK
LEFT JOIN geography.employee_number AS en ON emp.id = en.number_FK
WHERE first_name = 'John' AND last_name = 'Ausini'
GROUP BY emp.id
由于您只能获取单个用户的信息,因此我会接受 Salman A 的回答;但如果您要面向多个(或所有)用户,并且用户往往有很多电子邮件和号码,则此版本 可能 更快。
SELECT emp.id, first_name, second_name, last_name, department, positions, ee.mails, en.numbers
FROM geography.employee AS emp
INNER JOIN (SELECT email_FK, GROUP_CONCAT(email, " ", email_type SEPARATOR " || ") AS mails
FROM geography.employee_email
GROUP BY email_FK
) AS ee ON emp.id = ee.email_FK
LEFT JOIN (SELECT number_FK, GROUP_CONCAT(number, " ", number_type SEPARATOR " || ") AS numbers
FROM geography.employee_number
GROUP BY number_FK
) AS en ON emp.id = en.number_FK
;