web-dev-qa-db-fra.com

Compter avec si condition dans la requête mysql

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.

97
user1163513

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 
236
user319198

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 INT0 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().

54
mojuba

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é.

19
Edemilson Lima

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
2
Mosty Mostacho