2010-06-25 20 views
6

Bu çok basit görünüyor ama anlayamıyorum.Birden çok etiketle eşleşen bir öğe seçme

"item_tags" tablosu var ve 1 ve 2 etiketleriyle eşleşen öğelerin tümünü seçmek istiyorum (her öğenin her iki etiketinde de olması gerekir).

Bunu mysql'de nasıl yaparım? tablo oluşturun

geçerli:

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; 

teşekkürler!

+1

Öğeler nelerdir ve etiket 1 nedir ve etiket 2 nedir? –

cevap

11

Kullanım:

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 

Bir GROUP BY ve HAVING yan tümcesi olması gerekir tanımlı ve farklı etiket kimlikleri sayısı, IN yan tümcesinde belirttiğiniz etiketlerin sayısına eşit olmalıdır.

+0

vardı öğeleri bulmak istedim Teşekkürler, mükemmel çalıştı! –

0

buna benzer bir şey?

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'); 

DÜZENLEME:

suppouse sen items_tags vardır: (ITEM_ID, TAG_ID) tablo olarak

+1

Bu yaklaşım bir AND eşleşmesi yerine bir OR eşleşmesi olabilir, bu yüzden soruyu yanıtlamaz. , yani bu sorgu, tag1 veya tag2 .. ile eşleşen öğeleri ve ayrıca potansiyel olarak yinelenen öğeleri döndüren öğeleri bulacaktır. Soru sadece tag1 VE tag2 – timk

İlgili konular