J'ai deux tables, l'une pour les nouvelles et l'autre pour les commentaires, et je souhaite connaître le nombre de commentaires dont le statut a été défini comme approuvé.
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
Mais le problème avec cette requête est que la valeur minimale qui est extraite pour la colonne de commentaires est 1, qu’il existe ou non un commentaire correspondant à cette nouvelle.
Toute aide serait très appréciable.
Utilisez sum()
à la place de count()
Essayez ci-dessous:
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
Mieux encore (ou plus court quand même):
SUM(ccc_news_comments.id = 'approved')
Cela fonctionne car le type booléen dans MySQL est représenté par INT
0
et 1
, tout comme en C. (Peut ne pas être portable sur les systèmes de base de données.)
En ce qui concerne COALESCE()
comme indiqué dans d'autres réponses, de nombreuses API de langage convertissent automatiquement NULL
en ''
lors de l'extraction de la valeur. Par exemple, avec l'interface mysqli
de PHP, il serait prudent d'exécuter votre requête sans COALESCE()
.
Cela devrait fonctionner:
count(if(ccc_news_comments.id = 'approved', ccc_news_comments.id, NULL))
count()
uniquement vérifier si la valeur existe ou non. 0 équivaut à une valeur existante, donc il en compte un de plus, alors que NULL ressemble à une valeur inexistante et n'est donc pas compté.
Remplacez cette ligne:
count(if(ccc_news_comments.id = 'approved', ccc_news_comments.id, 0)) AS comments
Avec celui-ci:
coalesce(sum(ccc_news_comments.id = 'approved'), 0) comments