通过标签选择,同时还返回所选项目的所有标签

时间:2014-05-05 00:34:42

标签: sql

我有基本的标记表设置:

item (id, body)
tag_link (id, item_id, tag_id)
tag (id, name)

我可以通过JOIN来选择与标签列表匹配的所有项目:

SELECT i.* FROM item AS i
INNER JOIN tag_link AS tl
ON tl.item_id = i.id
AND tl.tag_id IN
  (SELECT tag.id FROM tag WHERE tag.name IN ('red', 'blue'))
GROUP BY i.id
HAVING COUNT(i.id) = 2

问题是我还想要与所选项目相关联的所有标签。

我遇到GROUP_CONCAT函数(我使用SQLite),并提出了这个问题:

SELECT i.*, GROUP_CONCAT(t.name) 
FROM item AS i
INNER JOIN tag_link AS tl
ON tl.item_id = i.id
AND tl.tag_id IN
  (SELECT tag.id FROM tag WHERE tag.name IN ('red', 'blue'))
INNER JOIN tag AS t ON t.id = tl.tag_id
GROUP BY i.id
HAVING COUNT(i.id) = 2

为每个返回的项添加一个类似"red, blue"的字段。到目前为止一切都很好。

但是如果这些项目还有其他与之关联的标签,这些标签不是查询的一部分,那么它们将无法返回。 所以我的问题是,如何为退回的商品添加所有代码?

谢谢!

1 个答案:

答案 0 :(得分:1)

请改用having子句。如果您想要包含redblue的商品的所有标签,请使用:

SELECT i.*, GROUP_CONCAT(t.name) 
FROM item i INNER JOIN
     tag_link tl
     ON tl.item_id = i.id INNER JOIN
     tag t
     ON t.id = tl.tag_id
GROUP BY i.id
HAVING sum(t.name IN ('red', 'blue')) > 0;