4

我有一个包含以下表格的 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 的帮助!

4

3 回答 3

4

如果您想要带有两个标签中的任何一个的项目,那么:

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 in ('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) 
    
于 2013-07-08T05:43:02.093 回答
0

尝试这个::

    Select *, count(1) as noOfTags from 
    items_tags
 group by item_id 
having  tag_name in ('yellow','fruit') and  noOfTags=2
于 2013-07-08T05:36:28.933 回答
0
   Select *, count(1) as noOfTags from 
    items_tags
 group by item_id 
having  tag_name in ('yellow','fruit') and  noOfTags=2

是的 noofTags 确保该项目带有所有标签,是的,如果您想搜索更多标签,您将在括号之间添加它 我同意 Mark 关于他的评论的另一件事,它们没用,您可以使用 view 代替它你想得到类似的东西(至少节省一些空间)。注意:我还不能发表评论,所以我发布了回答抱歉。

于 2013-07-08T05:51:44.183 回答