我希望使用两个关系表来获取与项目相关的标签和流派,但我得到重复的值。
这是我的查询,我按项目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
正如你所看到的,它给了我重复的值:
NAME TAGS GENRES
item1 tag2,tag1 genre1,genre1
答案 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
而不是id
。 group by
列与select
列匹配是一种很好的形式。