检索具有标记T1和T2的记录

时间:2009-03-06 09:27:40

标签: mysql tags

我需要一个sql查询,它将检索包含两个标签的所有项目,而不是任何标签。我已经有一个查询,但返回所有项目,而不是预期的结果。查找下面的详细说明。谢谢!

表格结构:

ITEMS TABLE
------------
item_id
item_name

TAGS TABLE
----------
tag_id
tag_name

ITEMTAGS TABLE
---------------
tag_id
item_id

查询:

SELECT Items.* FROM Items 
INNER JOIN ItemTags ON Items.item_id = ItemTags.item_id
WHERE ItemTags.tag_id IN (T1, T2)
GROUP BY Items.item_id

结果: 所有具有T1或T2的项目

预期结果: 所有同时具有T1和T2

的项目

2 个答案:

答案 0 :(得分:3)

select i.*
from items i, itemtags it1, itemtags it2
where i.item_id=it1.item_id and it1.tag_id=T1
and i.item_id=it2.item_id and it2.tag_id=T2;

答案 1 :(得分:0)

如果您的数据库支持intersect关键字(SqlServer),您可以写:

SELECT Items.* 
FROM Items 
WHERE Items.item_id in 
/* intersection between items that have the tag T1 
   and the ones that have the tag T2 */ 
(
    SELECT item_id FROM ItemTags WHERE tag_id = T1
    INTERSECT 
    SELECT item_id FROM ItemTags WHERE tag_id = T2
)

如果没有,您需要执行以下操作:

SELECT Items.* 
FROM Items 
WHERE Items.item_id in 
(
    SELECT ItemTags1.item_id 
    FROM ItemTags as ItemTags1 
        INNER JOIN ItemTags as ItemTags2 
        ON ItemTags1.item_id = ItemTags2.item_id 
    WHERE 
            ItemTags1.tag_id = T1
        AND ItemTags2.tag_id = T2
)

在第二个查询中,由于ItemTags1.item_id = ItemTags2.item_id,会处理可能的性能问题。您需要使用外键索引才能正常工作。