Mam dwie tabele, jedną dla wiadomości, a drugą dla komentarzy i chcę uzyskać liczbę komentarzy, których status został ustawiony jako zatwierdzony.
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
Ale problem z tym zapytaniem polega na tym, że minimalna wartość, która jest pobierana dla kolumny komentarzy, to 1, niezależnie od tego, czy istnieje komentarz odpowiadający tej wiadomości, czy nie.
Każda pomoc byłaby bardzo znacząca.
mysql
join
if-statement
count
user1163513
źródło
źródło
Odpowiedzi:
Użyj
sum()
zamiastcount()
Spróbuj poniżej:
źródło
null
gdyCOUNT
(żadne warunki) by nie zwróciły0
. KiedyCOUNT
będzie już wrócił nic ale 0, aleSUM
robi return 0, swoje zyski podstęp0
.num_relevant_parts
jestSUM
z warunkami,num_total_parts
jestCOUNT(parts.id)
(przepraszam za podwójny komentarz, było za późno na edycję)Jeszcze lepiej (lub krócej):
Działa to, ponieważ typ boolowski w MySQL jest reprezentowany jako
INT
0
i1
, podobnie jak w C. (może jednak nie być przenośny między systemami DB).Jak
COALESCE()
wspomniano w innych odpowiedziach, wiele interfejsów API języka automatycznie konwertuje sięNULL
na''
podczas pobierania wartości. Na przykład zmysqli
interfejsem PHP bezpieczne byłoby uruchomienie zapytania bezCOALESCE()
.źródło
To powinno działać:
count()
sprawdza tylko, czy wartość istnieje, czy nie. 0 jest równoważne istniejącej wartości, więc liczy się o jedną więcej, podczas gdy NULL jest jak nieistniejąca wartość, więc nie jest liczone.źródło
count
jest bardziej intuicyjny niżsum
w tym przypadku.Zastąp tę linię:
Z tym:
źródło
COALESCE
zwraca sumę? Wszelkie odniesienia w dokumencie MySQL?