带有GROUP_CONCAT的INNER JOIN返回重复值

时间:2018-11-29 00:59:51

标签: mysql

如果我尝试使用以下查询来查询数据库,则会得到预期的结果:

SELECT anime.anime, GROUP_CONCAT(themes.theme) AS themes
FROM anime
INNER JOIN anime_themes ON anime.id = anime_themes.anime_id
INNER JOIN themes ON themes.id = anime_themes.theme_id
GROUP BY anime.anime
ORDER BY anime.id;

示例输出: “健忘症,身体转换,自然灾害,悲剧”

但是,当我尝试使用以下查询一次查询更多数据时,会得到重复数据:

SELECT anime.*, directors.director, studios.studio, 
GROUP_CONCAT(genres.genre) AS genres, GROUP_CONCAT(themes.theme) AS themes
FROM anime
INNER JOIN anime_directors ON anime.id = anime_directors.anime_id
INNER JOIN directors ON directors.id = anime_directors.director_id
INNER JOIN anime_studios ON anime.id = anime_studios.anime_id
INNER JOIN studios ON studios.id = anime_studios.studio_id
INNER JOIN anime_genres ON anime.id = anime_genres.anime_id
INNER JOIN genres ON genres.id = anime_genres.genre_id
INNER JOIN anime_themes ON anime.id = anime_themes.anime_id
INNER JOIN themes ON themes.id = anime_themes.theme_id
GROUP BY anime.anime
ORDER BY anime.id;

示例输出: 身体开关,自然灾害,悲剧,健忘症,身体开关,自然灾害,自然灾害,悲剧,失忆症,健忘症,身体转换,自然灾害,悲剧,悲剧,健忘症,身体转换“

在第二个查询中,数据似乎并没有以连贯的顺序重复。为什么两个查询之间的行为不同,我该如何解决呢?谢谢。

编辑:只有“主题”和“流派”具有重复的值,而“导演”和“工作室”则没有,因此我认为它与GROUP_CONCAT函数有关。

2 个答案:

答案 0 :(得分:1)

只需添加DISTINCT。

示例:

    GROUP_CONCAT(DISTINCT genres.genre) AS genres, GROUP_CONCAT(DISTINCT 
 themes.theme) AS themes

答案 1 :(得分:1)

您要在第二个查询中连接更多表,这可能导致一条记录重复出现。 添加“ DISTINCT”可能会删除重复的值,但这不是优化此查询的最佳方法。 您还应该考虑使用子查询或左联接。