2016-03-26 18 views
0

Hey im yazma sql sorgusu, neredeyse yaptım ama önemli olan şeyi değiştirmem gerekiyor ama yine de tamir etme fikrim yok. Benim SQL örneğim varDeğerlerin WHERE IN yan tümcesiyle olmadığını kontrol edin - MYSQL

SELECT post.id,post.name as post_name, 
(SELECT users.login FROM users WHERE post.creator = users.id) creator, 
(SELECT COUNT(*) FROM recommends WHERE recommends.idea_id = post.id) recommends, 
(SELECT COUNT(*) FROM comments WHERE comments.idea_id = post.id) comments, 
GROUP_CONCAT(tags.tag SEPARATOR ',') as tags 
FROM posts 
LEFT JOIN tags 
ON post.id = tags.idea_id 
WHERE post.name IN 
(
    SELECT post.name FROM posts 
    JOIN tags ON post.id = post.idea_id 
    WHERE tags.tag IN ('X','Y','Z') 
) 
GROUP BY post.name 

Sorun nedir? X veya Y veya Z’niz yoksa, sorgu hala çalışıyor. Nasıl tamir edeceğini bilmiyorum, bazı VARSAYILAN deyimleri denedim veya BT değil, ama çalışmıyor. Yardım için teşekkürler. Eğer etiketlerden herhangi birine sahip mesajların arıyoruz

+0

? Sorgunuz aşırı karmaşık olsa da, sorgunuz etiketlerden birine sahip olan yayınları aramak için mükemmel bir anlam ifade ediyor. –

+0

İsterseniz, bu basit, iki aşamalı eylemi izlemeyi düşünün: 1. Henüz yapmadıysanız, CREATE ve INSERT ifadelerini (ve/veya bir sqlfiddle) sağlayın, böylece sorunu daha kolay çoğaltabiliriz. 2. Henüz yapmadıysanız, 1. adımda sağlanan bilgilere karşılık gelen istenen bir sonuç kümesi belirtin. – Strawberry

+0

Evet, ancak bu etiketlerden ('X', 'Y', 'Z') biri varsa, örneğin ileti etiketlerinden yok, ancak geri kalanı mevcut olmasına rağmen sonuç yanlıştır. –

cevap

0

ben bunu yapabilirsiniz:

SELECT post.id, post.name as post_name, 
     (SELECT users.login FROM users WHERE post.creator = users.id) as creator, 
     (SELECT COUNT(*) FROM recommends WHERE recommends.idea_id = post.id) as recommends, 
     (SELECT COUNT(*) FROM comments WHERE comments.idea_id = post.id) as comments, 
     GROUP_CONCAT(tags.tag SEPARATOR ',') as tags 
FROM posts LEFT JOIN 
    tags 
    ON post.id = tags.idea_id 
GROUP BY post.id, post.name 
HAVING SUM(tags.tag IN ('X', 'Y', 'Z')) > 0; 

Not: Ben post.id (isim her id için benzersiz olduğunu varsayarak içerecek şekilde GROUP BY değişti). Toplanmış tüm sütunları GROUP BY maddesine dahil etmek iyi bir uygulamadır. Aynı adda birden çok kimlik varsa, post.id'u SELECT'dan kaldırın. Eğer etiketleri ve hiçbir çiftleri (makul bir varsayım) vardır üçünü istiyorsanız

ardından HAVING değiştirin:

HAVING SUM(tags.tag IN ('X', 'Y', 'Z')) = 3; 
tam aradığınız ne
İlgili konular