2012-06-08 20 views
6

Bir tasarımlar listesi istediğim bir sol birleştirmeyle ilgili küçük bir sorunum var ve her tasarımda, her tasarımın kaç tane yorum içerdiğini görüntülemek istiyorum. Bir SOL kullanıyorumLEFT JOIN ve WHERE içinde saymak

SELECT ds.*, count(com.comment) AS countcom FROM tdic_designs ds 
LEFT JOIN tdic_comments com ON (com.design_id = ds.id) 
WHERE ds.approved = 1 AND ds.hidden = 0 AND com.approved = 1 
GROUP BY ds.id 
ORDER BY ds.date_added ASC 

KATILIN Ama sadece 1 yorumunuz var bir tasarıma görüntüler olarak bu işe yaramazsa, ama ikinci tasarım değil tabloda, iki tasarımları var yorum yap. Ben

SELECT ds.*, count(com.comment) AS countcom FROM tdic_designs ds 
LEFT JOIN tdic_comments com ON (com.design_id = ds.id) 
GROUP BY ds.id, com.approved, ds.approved 
ORDER BY ds.date_added ASC 

için SQL değiştirirseniz

NEREDE maddesini kaldırıyor O. Ancak onaylanmayan tasarımları ve yorumları seçecek kadar da kötü.

Neyi özlüyorum/yanlış mıyım?

+0

'MySQL' ben tahmin bir satır içi görünümüne dış tablo üzerindeki filtreler hareket edecek? – Quassnoi

cevap

8

Taşı ON maddeye yorumlarda Tüm filtreleri:

SELECT ds.*, COUNT(com.design_id) AS countcom 
FROM tdic_designs ds 
LEFT JOIN 
     tdic_comments com 
ON  com.design_id = ds.id 
     AND com.approved = 1 
WHERE ds.approved = 1 
     AND ds.hidden = 0 
GROUP BY 
     ds.id 
ORDER BY 
     ds.date_added ASC 
+0

Bir tedavi gibi çalışır! Çok teşekkürler! –

3

Eğer WHERE maddesini kullandığınızda left join s tarafından sağlanan satır uygulanan için, bu kısıtlamalar bulunmaktadır. Bu nedenle, kısıtlamalarla aynı fikirde değilse, bazı satırlar kaldırılır.

Yapmanız gereken şey, bu kısıtlamaları ON yan tümcesine koymaktır ve işe yaramazsa, satırı kaldırmak yerine NULL gösterir. Böyle

şey: Yalnızca group BY üzerinde ds.id varken

SELECT ds.id, count(com.comment) AS countcom 
FROM tdic_designs ds 
LEFT JOIN tdic_comments com ON (com.design_id = ds.id) AND ds.approved = 1 AND ds.hidden = 0 AND com.approved = 1 
GROUP BY ds.id 
ORDER BY ds.date_added ASC 

başka problem SELECT içinde ds.* kullanıyor.

+0

Bunun için teşekkürler :) –

+0

@MortenHagh sorun değil, eğer çalışıyorsa, cevabı kabul etmeyi unutmayın :) –

0

Sorun şu ki, WHERE yan tümcesinde com.approved = 1'u eklediğinizde, com.approved'un NULL olduğu satırları filtreler; bu, dış tabloda hiçbir eşleşmenin bulunmadığı tüm satırlar anlamına gelir.

Başkaları tarafından önerildiği gibi, bu koşulu ON maddesine taşıyarak bu sorunu giderebilirsiniz, ancak birleştirme koşulu olmadığı için bunu gerçekten sevmiyorum.

I

SELECT ds.*, count(com.comment) AS countcom FROM tdic_designs ds 
LEFT JOIN (SELECT * FROM tdic_comments com WHERE com.approved = 1) com 
ON (com.design_id = ds.id) 
WHERE ds.approved = 1 AND ds.hidden = 0 
GROUP BY ds.id 
ORDER BY ds.date_added ASC 
+0

Bu, "MySQL" üzerinde ciddi bir şekilde zarar verecek. – Quassnoi

+0

@DaveCosta çok zayıf çözüm .. –

+0

@ aF.why? Eğer Quassnoi tarafından belirtildiği gibi aynı sebepten bahsediyorsanız, haklı olabilirsiniz, fakat soru MySQL'i belirtmedi. Oracle'da bununla ilgili herhangi bir performans sorunu beklemezdim. –