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.
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). –
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
Harika cevap. Teşekkürler ! –