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.
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
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()
.
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.
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
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