2010-06-25 64 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