2010-07-16 11 views
18

Belirli bir Etiketler grubunun TÜMÜ ile eşleşen Nesneleri sorgulamaya çalışıyorum.Mysql, ALL etiketleriyle eşleşen çoklu "etiketler" (çoktan çoğa ilişki) için sorguya katılıyor mu?

Temel olarak, kullanıcıların daha fazla etiket ekleyebilmesini istiyorum.

Tablo yapmam, Nesneler tablosu, Etiketler tablosu ve MANY: MANY ilişki tablosu ObjectsTags.

SELECT * FROM Objects 
LEFT OUTER JOIN ObjectsTags ON (Objects.id=ObjectsTags.object_id) 
LEFT OUTER JOIN Tags ON (Tags.id=ObjectsTags.tag_id) 
böyle bir IN yan tümcesi/koşulunu kullanarak çalıştı

: Yani bir JOIN sorgu şöyle var

SELECT * FROM Objects 
LEFT OUTER JOIN ObjectsTags ON (Objects.id=ObjectsTags.object_id) 
LEFT OUTER JOIN Tags ON (Tags.id=ObjectsTags.tag_id) 
WHERE Tags.name IN ('tag1','tag2') 
GROUP BY Objects.id 

Ama bu OR bir dizi, bu nedenle daha fazla etiket taklit öğrendim Sorguya, elde ettiğim gibi daraltılmış sonuç kümesinin yerine aldığınız DAHA FAZLA sonuç verirsiniz.

Ben de koşullar birlikte ANDed birden GİBİ yapıyor çalıştı: DIŞ Tags.name sütunu sadece 'TaG1' içeriyor JOINed sonuçları gruplanmış ne zamandan beri,

SELECT * FROM Objects 
LEFT OUTER JOIN ObjectsTags ON (Objects.id=ObjectsTags.object_id) 
LEFT OUTER JOIN Tags ON (Tags.id=ObjectsTags.tag_id) 
WHERE Tags.name LIKE 'tag1' 
AND Tags.name LIKE 'tag2' 
GROUP BY Objects.id 

Ama bu sonuç verir ve ayrıca 'tag2' değil. 'Tag2' öğesinin eşleştiği sonuç satırı GROUPing tarafından "gizlendi".

Bittiğim "daraltılmış" veya "aşağı doğru" efektini almak için TÜMÜ ilgili etiketlerle nasıl eşleştirebilirim? Teşekkürler.

cevap

26

Kullanım:

SELECT * 
    FROM OBJECTS o 
    JOIN OBJECTSTAGS ot ON ot.object_id = o.id 
    JOIN TAGS t ON t.id = ot.tag_id 
    WHERE t.name IN ('tag1','tag2') 
GROUP BY o.id 
    HAVING COUNT(DISTINCT t.name) = 2 

Sen HAVING yan tümcesi eksik.

Yalnızca iki etiketin bulunduğu satırları istiyorsanız SOL JOIN'e gerek yoktur.

+1

Yinelenen olmadığından emin olmak için OBJECTTAGS içindeki sütun çiftinde birincil anahtar veya benzersiz bir kısıtlama/dizin yoksa DISTINCT gereklidir (bunlar yanlış pozitif olur). –

+0

harika çalışıyor! Teşekkürler! hiç bir zaman satır sayısı ile HAVING kullanmayı düşünmemiştim. Diğer insanlar için FYI: Ben HAVING yan tümce arama için etiketlerin sayısı eşleşir, böylece ('tag1', 'tag2', 'tag3') HAVING yan tümcesi için sorgularımı yapıyorum HAVING arıyorum COUNT (DISTINCT t.name) = 3, sonuçların TÜM etiketlere sahip olduğundan emin olmak için. – thaddeusmt

+0

Harika cevap. Teşekkürler ! –

İlgili konular