Cuenta con la condición if en la consulta mysql


Tengo dos tablas una es para noticias y otra es para comentarios y quiero obtener el recuento de los comentarios cuyo estado se ha establecido como aprobado.

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 obtiene para la columna comentarios es 1 si hay algún comentario existente correspondiente a esa noticia o no.

Cualquier ayuda sería muy apreciable.

Author: user1163513, 2012-03-21

4 answers

Utilizar sum() en lugar de count()

Prueba 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 
 211
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-03-21 05:15:46

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

SUM(ccc_news_comments.id = 'approved')

Esto funciona ya que el tipo booleano en MySQL se representa como INT 0 y 1, al igual que en C. (Puede no ser portátil a través de sistemas de base de datos, sin embargo.)

En cuanto a COALESCE() como se mencionó en otras respuestas, muchas API de idiomas convierten automáticamente NULL a '' al obtener el valor. Por ejemplo, con la interfaz de PHP mysqli sería seguro ejecutar su consulta sin COALESCE().

 49
Author: mojuba,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-01-18 23:48:32

Esto debería funcionar:

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

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

 15
Author: Edemilson Lima,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-10-26 12:40:25

Reemplace esta línea:

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

Con este:

coalesce(sum(ccc_news_comments.id = 'approved'), 0) comments
 1
Author: Mosty Mostacho,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-03-21 05:16:19