加入时数据库中的值重复

时间:2014-05-29 11:55:30

标签: mysql sql duplicates

我希望使用两个关系表来获取与项目相关的标签和流派,但我得到重复的值。

这是我的查询,我按项目ID对值进行分组,所以我不明白为什么它会给我重复的值。

SELECT
  name,
  GROUP_CONCAT(tag) AS tags,
  GROUP_CONCAT(genre) AS genres
FROM items
LEFT JOIN tagsItemsRelation ON
  tagsItemsRelation.itemId = items.id
LEFT JOIN tags ON
  tags.id = tagsItemsRelation.tagId
LEFT JOIN genresItemsRelation ON
  genresItemsRelation.itemId = items.id
LEFT JOIN genres ON
  genres.id = genresItemsRelation.genreId
GROUP BY items.id

Here is a SQLFiddle

正如你所看到的,它给了我重复的值:

NAME    TAGS        GENRES
item1   tag2,tag1   genre1,genre1

1 个答案:

答案 0 :(得分:1)

您正在同时聚合两个不同的维度。这就是你得到重复的原因。因此,如果一个名称有标签,t1,t2和t3以及流派g1和g2,那么你的联接会为这个名称生成六行,包括标签和流派的所有组合。

如果您只有少量标签和流派的多个值,那么最简单的解决方案是使用distinct

SELECT name, GROUP_CONCAT(DISTINCT tag) AS tags, GROUP_CONCAT(DISTINCT genre) AS genres
FROM items LEFT JOIN
     tagsItemsRelation
     ON tagsItemsRelation.itemId = items.id LEFT JOIN
     tags
     ON tags.id = tagsItemsRelation.tagId LEFT JOIN
     genresItemsRelation
     ON genresItemsRelation.itemId = items.id LEFT JOIN
     genres
     ON genres.id = genresItemsRelation.genreId
GROUP BY items.name;

如果您有大量重复项(每个名称数十个或数百个),则重复项的生成和处理可能是一个真正的性能问题。在这种情况下,您可能希望预先聚合每个维度的值,然后进行连接。

请注意,我将group by条件更改为name而不是idgroup by列与select列匹配是一种很好的形式。