it-swarm.com.de

Zähle mit der if-Bedingung in der mysql-Abfrage

Ich habe zwei Tabellen, eine für Nachrichten und eine für Kommentare, und ich möchte die Anzahl der Kommentare abrufen, deren Status als genehmigt festgelegt wurde.

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 

Das Problem bei dieser Abfrage ist jedoch, dass der Mindestwert, der für die Kommentarspalte abgerufen wird, 1 ist, unabhängig davon, ob ein Kommentar für diese Nachricht vorhanden ist oder nicht.

Jede Hilfe wäre sehr dankbar.

97
user1163513

Verwenden Sie sum() anstelle von count()

Versuchen Sie es unten:

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

Besser noch (oder sowieso kürzer):

SUM(ccc_news_comments.id = 'approved')

Dies funktioniert, da der Boolesche Typ in MySQL wie in C als INT0 Und 1 Dargestellt wird.

Wie bei COALESCE(), wie in anderen Antworten erwähnt, konvertieren viele Sprach-APIs NULL beim Abrufen des Werts automatisch in ''. Zum Beispiel wäre es mit der PHP-Schnittstelle mysqli sicher, Ihre Abfrage ohne COALESCE() auszuführen.

54
mojuba

Das sollte funktionieren:

count(if(ccc_news_comments.id = 'approved', ccc_news_comments.id, NULL))

count() prüft nur, ob der Wert existiert oder nicht. 0 entspricht einem existierenden Wert, zählt also noch einen, während NULL einem nicht existierenden Wert gleicht, also nicht gezählt wird.

19
Edemilson Lima

Ersetzen Sie diese Zeile:

count(if(ccc_news_comments.id = 'approved', ccc_news_comments.id, 0)) AS comments

Mit diesem:

coalesce(sum(ccc_news_comments.id = 'approved'), 0) comments
2
Mosty Mostacho