Saya memiliki dua tabel, satu untuk berita dan satu lagi untuk komentar dan saya ingin menghitung jumlah komentar yang statusnya telah ditetapkan sebagai disetujui.
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
Tapi masalah dengan query ini adalah nilai minimum yang diambil untuk kolom komentar adalah 1 apakah ada komentar yang sesuai dengan berita itu atau tidak.
Bantuan apa pun akan sangat berarti.
mysql
join
if-statement
count
pengguna1163513
sumber
sumber
Jawaban:
Gunakan
sum()
di tempatcount()
Coba di bawah ini:
sumber
null
ketikaCOUNT
(tidak ada kondisi) yang dikembalikan0
. KetikaCOUNT
akan pernah kembali apa-apa tapi 0, tetapiSUM
tidak kembali 0, pengembalian trik Anda0
.num_relevant_parts
adalahSUM
dengan kondisi,num_total_parts
adalahCOUNT(parts.id)
(maaf untuk komentar ganda, terlambat untuk mengedit)Lebih baik lagi (atau lebih pendek lagi):
Ini berfungsi karena tipe Boolean di MySQL direpresentasikan sebagai
INT
0
dan1
, seperti di C. (Mungkin tidak portabel di seluruh sistem DB.)Seperti yang
COALESCE()
disebutkan dalam jawaban lain, banyak API bahasa secara otomatis dikonversiNULL
ke''
saat mengambil nilainya. Misalnya denganmysqli
antarmuka PHP, akan aman untuk menjalankan kueri Anda tanpaCOALESCE()
.sumber
Ini harus bekerja:
count()
hanya periksa apakah nilainya ada atau tidak. 0 setara dengan nilai yang ada, jadi ia menghitung satu lagi, sedangkan NULL seperti nilai yang tidak ada, jadi tidak dihitung.sumber
count
lebih intuitif daripadasum
dalam kasus ini.Ganti baris ini:
Dengan yang ini:
sumber
COALESCE
mengembalikan jumlahnya? Ada referensi di dokumen MySQL?