我有基本的标记表设置:
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"
的字段。到目前为止一切都很好。
但是如果这些项目还有其他与之关联的标签,这些标签不是查询的一部分,那么它们将无法返回。 所以我的问题是,如何为退回的商品添加所有代码?
谢谢!
答案 0 :(得分:1)
请改用having
子句。如果您想要包含red
或blue
的商品的所有标签,请使用:
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;