MySQL使用多个左连接获取重复项

Posted

技术标签:

【中文标题】MySQL使用多个左连接获取重复项【英文标题】:MySQL getting duplicates using multiple left join 【发布时间】:2018-08-24 13:38:39 【问题描述】:

由于某种原因,我使用以下查询从标签和人员表中获取重复值:

# Selects
SELECT 
Organization.name AS 'Name',
GROUP_CONCAT(Person.name) AS 'Persons',
GROUP_CONCAT(Tag.name) AS 'Tags'

# From
FROM Organization

# Joins
LEFT JOIN Person ON Organization.id = Person.organizationID
LEFT JOIN Refs ON Organization.id = Refs.fromID
LEFT JOIN Tag ON Tag.id = Refs.toID

GROUP BY Organization.id

如果我删除“Person”或“Refs + Tag”JOIN,重复项就会消失。我对这个问题有点困惑。

这是 SQL Fiddle 的链接: http://sqlfiddle.com/#!9/6251f/3/0

【问题讨论】:

这是因为公司 1 有两个与之关联的标签,所以每个标签都会得到一个响应。如果您输出的是单独的行数据而不是连接,您会在每行看到不同的标签 ID。 【参考方案1】:

与标签/参考表的连接导致每个组织,因此该组织内的人员被复制。您可以尝试在单独的子查询中聚合人员和标签。以下似乎有效:

SELECT 
    org.name AS Name,
    t1.Persons,
    t2.Tags
FROM Organization org
LEFT JOIN
(
    SELECT organizationID, GROUP_CONCAT(name) AS Persons
    FROM Person
    GROUP BY organizationID
) t1
    ON org.id = t1.organizationID
LEFT JOIN
(
    SELECT r.fromID, GROUP_CONCAT(t.name) AS Tags
    FROM Refs r
    LEFT JOIN Tag t
        ON t.id = r.toID
    GROUP BY r.fromID
) t2
    ON org.id = t2.fromID;

Demo

【讨论】:

此解决方案似乎丢失了分配给第二号公司的“标签 2”。 @Leinonen 在我的最新编辑中修复。我现在正在玩手机,这会减慢速度。

以上是关于MySQL使用多个左连接获取重复项的主要内容,如果未能解决你的问题,请参考以下文章

mysql 查询 - 使用左连接和 where 子句的多个计数

mysql多个表之间的连接方式(内连接左连接右连接)delete删除表内数据的方法以及mysql索引

mysql中的左连接和右连接有啥区别[重复]

MySQL使用左连接将多列匹配为一[重复]

使用子查询改进 MySql 查询左外连接

MySQL 多个左连接