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

标签 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"

我试过只加入一个多对多连接,而且效果很好,所以我想我正在监督多个连接的东西......

最佳答案

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

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

尽管对于大表,这可能不是很有效。第二种方法是在两个子查询(派生表)中使用 GROUP BY,其中一个是 awards ,另一个是 colurs other,然后加入这些派生表。

关于sql - 使用两个多对多时 GROUP_CONCAT 中的重复值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17208221/

相关文章:

android - 在android中记录SQL查询

postgresql - Postgres 多对多 : how to select record with exactly counted links

ruby-on-rails - 电影应用的多对多关系

mysql - sql查询以查找至少具有两种类型帐户的用户

MySQL 更新子查询表被指定两次

android - Android:将多行插入sqlite数据库不起作用

python - Django : ManyToMany relation error ( object has no attribute)

sql - 为什么在更改值时查询永远需要

mysql - 多列之间的 SQL COUNT

c++ - sqlite中的文本挖掘