MySQL加入分组没有完美加入

Posted

技术标签:

【中文标题】MySQL加入分组没有完美加入【英文标题】:MySQL joining with grouping did not join perfectly 【发布时间】:2021-12-26 13:20:00 【问题描述】:

我有三个表并想加入它们,但是当使用联系人表中的父 ID 分组时,加入会多次返回单行。

contact表-

id Name
1 Murad
2 Tajharul

phone表-

id contact_id phone
1 1 017
2 2 014
3 2 015

email表-

id contact_id email
1 1 mur@test.com
2 1 has@test.com
3 1 tan@test.com
4 2 taj@test.com
5 2 har@test.com

期望的输出-

id Name Phone Email
1 Murad 017 mur@test.com,has@test.com,tan@test.com
2 Tajharul 014,015 taj@test.com,har@test.com

这是我迄今为止尝试过的-

SELECT contact.name , GROUP_CONCAT(phone.phone) phone, GROUP_CONCAT(email.email) email
FROM 
    contact 
    JOIN phone ON contact.id = phone.contact_id
    JOIN email ON contact.id = email.contact_id
GROUP BY contact.id

mysql Fiddle 链接:http://sqlfiddle.com/#!9/ded29f/1

【问题讨论】:

使用distinct:sqlfiddle.com/#!9/ded29f/2 【参考方案1】:

在 group_concat 中使用 DISTINCT

SELECT contact.name , GROUP_CONCAT(DISTINCT phone.phone) phone, GROUP_CONCAT(DISTINCT email.email) email
FROM 
    contact 
    JOIN phone ON contact.id = phone.contact_id
    JOIN email ON contact.id = email.contact_id
GROUP BY contact.id

【讨论】:

第二个联系人有两次相同的电子邮件..New Fiddle link 如果您不想在电子邮件中区分,请删除 DISTINCT【参考方案2】:

您可以通过在 Group concat 中使用子查询和 Distinct 来实现:

SELECT T1.id, T1.name, T1.phone, GROUP_CONCAT(DISTINCT email.email) email
FROM 
    (SELECT contact.id, contact.name , GROUP_CONCAT(DISTINCT phone.phone) phone
    FROM 
        contact 
        JOIN phone ON contact.id = phone.contact_id
  GROUP BY contact.id) T1
JOIN email ON T1.id = email.contact_id
GROUP BY T1.id

【讨论】:

第二个联系人有两次相同的电子邮件..New link 我已经更新了解决方案,现在查看 好的,我检查一下

以上是关于MySQL加入分组没有完美加入的主要内容,如果未能解决你的问题,请参考以下文章

mysql 分组和加入

MySQL 4 表作为主表加入和分组

慢查询分组,加入MYSQL laravel

新来的领导下令升级 MySQL 8.0,完美掉坑…

Android Okhttp完美同步持久Cookie实现免登录

如何完美免费安装Photoshop CS6