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
null
cuandoCOUNT
(sin condiciones) hubiera regresado0
. CuandoCOUNT
se habría devuelto nada , pero 0, pero laSUM
hace de retorno 0, sus declaraciones de truco0
.num_relevant_parts
esSUM
con condiciones,num_total_parts
esCOUNT(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
INT
0
y1
, 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áticamenteNULL
al''
cual se deben recuperar el valor. Por ejemplo, con lamysqli
interfaz 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
count
es más intuitivo quesum
en este caso.Reemplazar esta línea:
Con este:
fuente
COALESCE
devuelve la suma? ¿Alguna referencia en el documento de MySQL?