使用两个多对多时,GROUP_CONCAT中的值重复

时间:2013-06-20 07:57:23

标签: sql sqlite many-to-many

我正在尝试将字符串中的两个多对多关联。在这个例子中,每个团队都有不确定数量的颜色和一个未确定的数字赢得奖项。

这是架构:

enter image description here

这是我正在使用的查询:

SELECT
    teams.name AS name,
    GROUP_CONCAT(colours.name) AS colours,
    GROUP_CONCAT(awards.name) AS awards
FROM
    teams

-- join colours
INNER JOIN teams_to_colours
        ON teams.id = teams_to_colours.team_id

INNER JOIN colours
        ON teams_to_colours.colour_id = colours.id

-- join awards
INNER JOIN teams_to_awards
        ON teams.id = teams_to_awards.team_id

INNER JOIN awards
        ON teams_to_awards.award_id = awards.id

WHERE
    teams.name="A-Team"

GROUP BY
    teams.id

问题在于颜色和奖项是重复的。让我们说A-Team有红色和蓝色作为颜色,作为奖项TrollAward和DarwinAward ......我从SQL得到的结果看起来像这样:

name: "A-Team"
colours: "red,blue,red,blue"
awards: "TrollAward,DarwinAward,TrollAward,DarwinAward"

我试图只加入一对多,并且完美地工作,所以我想我正在监督多个连接的内容......

1 个答案:

答案 0 :(得分:4)

快速而肮脏的答案是在DISTINCT函数中添加GROUP_CONCAT()

SELECT
    teams.name AS name,
    GROUP_CONCAT(DISTINCT colours.name) AS colours,
    GROUP_CONCAT(DISTINCT awards.name) AS awards
...

尽管使用大表,但这可能效率不高。第二种方法是在两个子查询(派生表)中GROUP BY,在其中从一个awards和另一个colurs获得串联,然后连接这些派生表。 / p>