J'ai deux tableaux, l'un pour les actualités et l'autre pour les commentaires et je veux obtenir le décompte des 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 récupérée pour la colonne de commentaires est 1, qu'il existe un commentaire correspondant à cette nouvelle ou non.
Toute aide serait très appréciable.
mysql
join
if-statement
count
user1163513
la source
la source
Réponses:
Utiliser
sum()
à la place decount()
Essayez ci-dessous:
la source
null
quandCOUNT
(aucune condition) serait revenue0
. QuandCOUNT
aurait tout retourné , mais 0, mais leSUM
fait retour 0, vos déclarations de truc0
.num_relevant_parts
estSUM
avec conditions,num_total_parts
estCOUNT(parts.id)
(désolé pour le double commentaire, était trop tard pour éditer)Mieux encore (ou plus court quand même):
Cela fonctionne puisque le type booléen dans MySQL est représenté par
INT
0
et1
, tout comme en C. (peut ne pas être portable sur les systèmes de base de données.)Pour ce qui est
COALESCE()
mentionné dans d' autres réponses, de nombreuses API de langue convertissent automatiquementNULL
à''
lors de la récupération de la valeur. Par exemple, avec l'mysqli
interface de PHP, il serait sûr d'exécuter votre requête sansCOALESCE()
.la source
Cela devrait fonctionner:
count()
vérifier uniquement si la valeur existe ou non. 0 est équivalent à une valeur existante, donc il en compte une de plus, tandis que NULL est comme une valeur inexistante, donc n'est pas compté.la source
count
c'est plus intuitif quesum
dans ce cas.Remplacez cette ligne:
Avec celui-ci:
la source
COALESCE
la somme? Une référence dans la doc MySQL?