我有一个包含以下表格的MySQL数据库:
items | id, item
items_tags | id, item_name, item_id, tag_name, tag_id
tags | id, tag
我想允许用户搜索带有任何标签或任何标签组合的项目。这是一些示例数据,用于显示我想要做的事情:
items:
id | item
-----------
1 | banana
2 | orange
3 | tomato
items_tags:
id | item_name | item_id | tag_name | tag_id
---------------------------------------------
1 | banana | 1 | yellow | 1
2 | banana | 1 | fruit | 2
3 | orange | 2 | orange | 3
4 | orange | 2 | fruit | 2
5 | tomato | 3 | red | 4
6 | tomato | 3 | vegetable| 5
tags:
id | tag
--------------
1 | yellow
2 | fruit
3 | orange
4 | red
5 | vegetable
我可以运行什么查询只返回标有“黄色”和“水果”的项目(即应该返回行 1个项目)?
谢谢!
以下是工作答案:
SELECT *
FROM items
WHERE id IN (
SELECT item_id
FROM items_tags
WHERE tag_name IN ('yellow', 'fruit')
GROUP BY item_id
HAVING COUNT(*) = 2
)
感谢chetan的帮助!
答案 0 :(得分:1)
如果你想要带有两个标签中的任何一个的项目:
select distinct item_id, item_name
from items_tags
where tag_name in ('yellow', 'fruit');
如果您希望项目同时包含两个标记:
select item_id, item_name
from items_tags
where tag_name id ('yellow', 'fruit')
group by item_id, item_name
having count(*) = 2;
根据您的评论
select a.id, a.item
from items a, items_tags b, tags c
where a.id = b.item_id
and b.tag_id = c.id
group by id, item
having (group_concat(c.tag) like '%yellow%'
and group_concat(c.tag) like '%fruit%')
or group_concat(c.tag) = 'red';
此查询从items表中提供id和item。它给出了具有黄色和水果标签的物品。和只有红色标签的物品。
如果您想获得带有两个标签且只有两个标签的项目,请在子句
中使用以下条件(group_concat(c.tag) like '%yellow%'
and group_concat(c.tag) like '%fruit%'
and count(*) = 2)
答案 1 :(得分:0)
试试这个::
Select *, count(1) as noOfTags from
items_tags
group by item_id
having tag_name in ('yellow','fruit') and noOfTags=2
答案 2 :(得分:0)
Select *, count(1) as noOfTags from
items_tags
group by item_id
having tag_name in ('yellow','fruit') and noOfTags=2
是noofTags在这里确保该项目标记有所有标签,是,如果您想要搜索更多标签,则将其添加到括号中 另一件事我同意马克关于他的评论,他们是无用的&您可以使用视图而不是它想要获得类似的东西(至少节省一些空间)。 注意:我无法发表评论,所以我发布了答案抱歉。