2010-06-25 47 views
6

这看起来很基本,但我无法弄清楚。选择一个匹配多个标签的项目

我有一个表“item_tags”,我想选择所有匹配标签1和2的项目(因为每个项目都必须有两个标签)。

我如何在mysql中执行此操作?

创建表:

CREATE TABLE `item_tags` (
    `uid_local` int(11) NOT NULL DEFAULT '0', 
    `uid_foreign` int(11) NOT NULL DEFAULT '0', 
    `sorting` int(11) NOT NULL DEFAULT '0', 
    KEY `uid_local` (`uid_local`), 
    KEY `uid_foreign` (`uid_foreign`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8; 

谢谢!

+1

项目在哪里,标签1和标签2是什么? – 2010-06-25 16:59:27

回答

11

用途:

SELECT i.uid 
    FROM ITEMS i 
    JOIN ITEM_TAGS it ON it.uid_local = i.uid 
        AND it.uid_foreign IN (1, 2) 
GROUP BY i.uid 
    HAVING COUNT(DISTINCT it.uid_foreign) = 2 

你需要有一个GROUP BY和HAVING子句定义,并且不同标记ID的计数必须等于您在IN子句中指定的标记数。

+0

谢谢,完美无缺! – 2010-06-28 08:07:24

0

这样的事情?

SELECT i.* from items i inner join items_tags it 
on i.id = it.item_id 
inner join tags t 
on t.id = it.tag_id 
WHERE t.name in ('tag1', 'tag2'); 

编辑:

suppouse你有items_tags:(ITEM_ID,TAG_ID)如表

+1

这个问题应该是OR匹配而不是AND匹配,所以它没有回答这个问题。 即该查询将查找匹配tag1或tag2的项目,并且还可能返回重复的项目。该问题只想找到既有tag1又有tag2的物品 – timk 2016-06-08 09:46:44