2012-03-21 8 views
77

Tengo dos tablas, una para noticias y otra para comentarios y quiero obtener el conteo para los comentarios cuyo estado se ha establecido como aprobado.Cuenta con condición if en la consulta de 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 

Pero el problema con esta consulta es que el valor mínimo que se trae para la columna de comentarios es 1 si hay algún comentario existente correspondiente a esa noticia o no.

Cualquier ayuda sería muy apreciable.

+4

¿Qué sucede si usa SUM en lugar de COUNT? –

Respuesta

199

uso sum() en lugar de count()

Trate a continuación:

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

Gracias, simplemente me solucionó el problema. Muchas gracias ..... – user1163513

+0

Deberías aceptar la respuesta que te ayudó http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer- trabajo –

+8

O incluso SUMA (ccc_news_comments.id = 'approved') como un truco específico de MySQL – mojuba

1

Reemplazar esta línea:

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

Con éste:

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

count (if (ccc_news_comments.id = 'approved', ccc_news_comments.id , 0)) ??? ¿Cuál será el significado de usar suma si usa ccc_news_comments.id –

+0

Disculpe, ¿qué quiere decir? El valor booleano se convierte en 0 o 1, luego en suma, y ​​en caso de que haya algún valor nulo se fusiona con 0 –

+0

¡El truco de unión es realmente genial! – rewritten

12

Este debería funcionar:

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

count() únicamente Verificar si el valor existe o no. 0 es equivalente a un valor existente, por lo que cuenta una más, mientras que NULL es como un valor inexistente, por lo que no se cuenta.

+0

Creo que 'count' es más intuitivo que' sum' en este caso. – Jeffery

45

Mejor aún (o más corto de todos modos):

SUM(ccc_news_comments.id = 'approved') 

Esto funciona ya que el tipo de Boole en MySQL se representa como INT0 y 1, al igual que en C (Puede no ser portable a través de los sistemas de base de datos sin embargo.)

en cuanto a COALESCE() como se ha mencionado en otras respuestas, muchas API de lenguaje convierten automáticamente NULL-'' al recuperar el valor. Por ejemplo, con la interfaz mysqli de PHP, sería seguro ejecutar su consulta sin COALESCE().

+3

Esto hace que el código sql sea mucho más legible. Hermosa solución. –