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

bgu*_*ach 6 sql sqlite many-to-many

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

这是架构:

在此输入图像描述

这是我正在使用的查询:

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
Run Code Online (Sandbox Code Playgroud)

问题在于颜色和奖励是重复的.让我们说A-Team有红色和蓝色作为颜色,作为奖项TrollAward和DarwinAward ......我从SQL得到的结果如下:

name: "A-Team"
colours: "red,blue,red,blue"
awards: "TrollAward,DarwinAward,TrollAward,DarwinAward"
Run Code Online (Sandbox Code Playgroud)

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

ype*_*eᵀᴹ 4

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

SELECT
    teams.name AS name,
    GROUP_CONCAT(DISTINCT colours.name) AS colours,
    GROUP_CONCAT(DISTINCT awards.name) AS awards
...
Run Code Online (Sandbox Code Playgroud)

尽管对于大表来说这可能不是很有效。第二种方法是在两个子查询(派生表)中,从一个子查询和另一个子查询中GROUP BY获取串联,然后连接这些派生表。awardscolurs