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 vorhanden ist, der dieser Nachricht entspricht oder nicht.
Jede Hilfe wäre sehr dankbar.
mysql
join
if-statement
count
user1163513
quelle
quelle
Antworten:
Verwenden Sie
sum()
anstelle voncount()
Versuchen Sie es unten:
quelle
null
wennCOUNT
(keine Bedingungen) zurückgekehrt wäre0
. WennCOUNT
habe etwas zurück , aber 0, aber dasSUM
tut return 0, Ihr Trick zurückkehrt0
.num_relevant_parts
istSUM
mit Bedingungen,num_total_parts
istCOUNT(parts.id)
(Entschuldigung für doppelten Kommentar, war zu spät zum Bearbeiten)Besser noch (oder sowieso kürzer):
Dies funktioniert, da der Boolesche Typ in MySQL wie
INT
0
und1
in C dargestellt wird (möglicherweise nicht auf DB-Systemen portierbar).Was
COALESCE()
wie in anderen Antworten erwähnt, konvertiert viele Sprechen APIs automatischNULL
auf ,''
wenn der Wert abgerufen werden . Zum Beispiel wäre es mit der PHP-mysqli
Schnittstelle sicher, Ihre Abfrage ohne auszuführenCOALESCE()
.quelle
Das sollte funktionieren:
count()
Überprüfen Sie nur, ob der Wert vorhanden ist oder nicht. 0 entspricht einem vorhandenen Wert, zählt also einen weiteren, während NULL wie ein nicht vorhandener Wert ist und daher nicht gezählt wird.quelle
count
ist intuitiver alssum
in diesem Fall.Ersetzen Sie diese Zeile:
Mit diesem:
quelle
COALESCE
die Summe zurück? Irgendeine Referenz in MySQL doc?