2012-03-21 17 views
77

Ho due tabelle una è per le notizie e un'altra è per i commenti e voglio ottenere il conteggio per i commenti il ​​cui stato è stato impostato come approvato.Contare con condizione if nella query mysql

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 

Ma il problema con questa query è che il valore minimo che venga prelevato per la colonna commenti è 1 se ci sono commenti esistente corrispondente a quella notizia o no.

Qualsiasi aiuto sarebbe molto apprezzabile.

+4

Cosa succede se si utilizza SUM invece di COUNT? –

risposta

199

uso sum() al posto di count()

Prova di seguito:

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

Grazie per aver risolto il problema per me.Grazie molto ..... – user1163513

+0

Devi accettare la risposta che ti ha aiutato http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer- lavoro –

+8

O anche SUM (ccc_news_comments.id = 'approved') come trucco specifico per MySQL – mojuba

1

Sostituire questa linea:

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

Con questo:

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

(if (ccc_news_comments.id = 'approved', ccc_news_comments.id , 0)) ??? cosa significherà usare sum se usi ccc_news_comments.id –

+0

Scusa, cosa intendi? Il valore booleano diventa 0 o 1, quindi somma, e nel caso in cui ci sia qualche valore nullo si coalesce con 0 –

+0

Il trucco coeso è davvero forte! – rewritten

12

Questo dovrebbe funzionare:

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

count() verificare solo se il valore esiste o no. 0 è equivalente a un valore esistente, quindi ne conta ancora uno, mentre NULL è come un valore inesistente, quindi non viene conteggiato.

+0

Penso che 'count' sia più intuitivo di' sum' in questo caso. – Jeffery

45

Meglio ancora (o più breve comunque):

SUM(ccc_news_comments.id = 'approved') 

Questo funziona perché il tipo booleano in MySQL è rappresentata come INT0 e 1, proprio come in C. (Potrebbe non essere portabile su sistemi di DB però.

Per quanto riguarda COALESCE() come indicato in altre risposte, molte API di lingua convertono automaticamente NULL in '' durante il recupero del valore. Ad esempio con l'interfaccia mysqli di PHP sarebbe sicuro eseguire la query senza COALESCE().

+3

Questo rende molto più leggibile il codice sql. Bella soluzione. –