Tenho duas tabelas, uma para notícias e outra para comentários e desejo obter a contagem dos comentários cujo status foi definido como aprovado.
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
Mas o problema com esta consulta é que o valor mínimo que é buscado para a coluna de comentários é 1 quer haja algum comentário existente correspondente a essa notícia ou não.
Qualquer ajuda seria muito apreciável.
mysql
join
if-statement
count
user1163513
fonte
fonte
Respostas:
Use
sum()
no lugar decount()
Experimente abaixo:
fonte
null
quandoCOUNT
(sem condições) teria retornado0
. QuandoCOUNT
teria retornado nada , mas 0, mas oSUM
faz de retorno 0, seu truque retornos0
.num_relevant_parts
estáSUM
com condições,num_total_parts
estáCOUNT(parts.id)
(desculpe pelo duplo comentário, era tarde demais para editar)Melhor ainda (ou mais curto de qualquer maneira):
Isso funciona porque o tipo booleano no MySQL é representado como
INT
0
e1
, assim como em C. (pode não ser portável em sistemas de banco de dados).Conforme
COALESCE()
mencionado em outras respostas, muitas APIs de linguagem são convertidas automaticamenteNULL
para''
ao buscar o valor. Por exemplo, com amysqli
interface do PHP , seria seguro executar sua consulta semCOALESCE()
.fonte
Isso deve funcionar:
count()
verifique apenas se o valor existe ou não. 0 é equivalente a um valor existente, então ele conta mais um, enquanto NULL é como um valor inexistente, então não é contado.fonte
count
é mais intuitivo do quesum
neste caso.Substitua esta linha:
Com este:
fonte
COALESCE
devolve a quantia? Qualquer referência no documento MySQL?