Tengo dos tablas, una es para noticias y la otra 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 de comentarios es 1, ya sea que exista algún comentario correspondiente a esa noticia o no.
Cualquier ayuda sería muy apreciada.
mysql
join
if-statement
count
usuario1163513
fuente
fuente

Respuestas:
Usar
sum()en lugar decount()Prueba a continuación:
fuente
nullcuandoCOUNT(sin condiciones) hubiera regresado0. CuandoCOUNTse habría devuelto nada , pero 0, pero laSUMhace de retorno 0, sus declaraciones de truco0.num_relevant_partsesSUMcon condiciones,num_total_partsesCOUNT(parts.id)(perdón por el doble comentario, era demasiado tarde para editar)Mejor aún (o más corto de todos modos):
Esto funciona ya que el tipo booleano en MySQL se representa como
INT0y1, al igual que en C. (aunque puede que no sea portátil en sistemas de base de datos).En cuanto a
COALESCE()como se ha mencionado en otras respuestas, muchas API de lenguaje convierten automáticamenteNULLal''cual se deben recuperar el valor. Por ejemplo, con lamysqliinterfaz de PHP sería seguro ejecutar su consulta sinCOALESCE().fuente
Esto debería funcionar:
count()solo verifique 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.fuente
countes más intuitivo quesumen este caso.Reemplazar esta línea:
Con este:
fuente
COALESCEdevuelve la suma? ¿Alguna referencia en el documento de MySQL?