2012-03-21 29 views
77

Biri haberler için diğeri yorumlar için iki tablo var ve statüsü onaylanmış olarak ayarlanmış olan yorumlar için sayım almak istiyorum.Eğer mysql sorgusunda bir koşul varsa sayım

SELECT ccc_news . * , 
count(if(ccc_news_comments.id = 'approved', ccc_news_comments.id, 0)) AS comments 
FROM ccc_news 
LEFT JOIN ccc_news_comments ON ccc_news_comments.news_id = ccc_news.news_id 
WHERE `ccc_news`.`category` = 'news_layer2' 
AND `ccc_news`.`status` = 'Active' 
GROUP BY ccc_news.news_id 
ORDER BY ccc_news.set_order ASC 
LIMIT 20 

Ama bu sorgu ile sorun comments sütun için getirilen minimum değer olduğunu haber veya olmamak üzere herhangi bir yorum mevcut olup olmadığını 1 olmasıdır.

Herhangi bir yardım büyük bir memnuniyetle karşılanacaktır. count()

yerine

+4

COUNT yerine SUM kullanırsanız ne olur? –

cevap

199

kullanım sum() aşağıda deneyin: Bu biriyle

count(if(ccc_news_comments.id = 'approved', ccc_news_comments.id, 0)) AS comments 

:

SELECT ccc_news . * , 
SUM(if(ccc_news_comments.id = 'approved', 1, 0)) AS comments 
FROM ccc_news 
LEFT JOIN ccc_news_comments ON ccc_news_comments.news_id = ccc_news.news_id 
WHERE `ccc_news`.`category` = 'news_layer2' 
AND `ccc_news`.`status` = 'Active' 
GROUP BY ccc_news.news_id 
ORDER BY ccc_news.set_order ASC 
LIMIT 20 
+0

Sadece benim için sorunu çözdüğünüz için teşekkür ederiz. Çok teşekkürler ..... – user1163513

+0

Size yardımcı olan cevabı kabul etmelisiniz http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer- –

+8

veya hatta SUM (ccc_news_comments.id = 'approved') MySQL'e özel bir hile olarak – mojuba

1

bu satırı değiştirin

coalesce(sum(ccc_news_comments.id = 'approved'), 0) comments 
+0

(eğer (ccc_news_comments.id = 'approved', ccc_news_comments.id) , 0)) ??? ccc_news_comments.id kullanırsanız toplamı kullanmanın anlamı ne olur –

+0

Üzgünüm, ne demek istiyorsun? Boolean değeri 0 veya 1, sonra toplam olur ve 0 –

+0

ile null değer birleştirme olması durumunda, birleştirme hilesi gerçekten harikadır! – rewritten

12

Bu çalışması gerekir: Değer var olup olmadığını

count(if(ccc_news_comments.id = 'approved', ccc_news_comments.id, NULL)) 

count()

sadece kontrol edin. 0 varolan bir değere eşdeğerdir, bu yüzden bir tane daha sayar, NULL ise varolmayan bir değer gibidir, sayılmaz.

+0

Sanırım bu sayımda 'count'' sum'dan daha sezgisel. – Jeffery

45

İyisi (veya daha kısa zaten): MySQL Boole tip olsa sadece C. gibi INT0 ve 1, (DB sistemleri arasında taşınabilir olmayabilir olarak temsil edilir beri

SUM(ccc_news_comments.id = 'approved') 

Bu çalışır.) Diğer yanıtlarda belirtildiği gibi, COALESCE()'a gelince, birçok dil API'si, değeri aldığında NULL değerini '''a otomatik olarak dönüştürür. Örneğin, PHP'nin mysqli arayüzüyle, COALESCE() olmadan sorgunuzu çalıştırmak güvenli olacaktır.

+3

Bu, önemli ölçüde daha okunabilir sql kodu için yapar. Güzel çözüm. –