Cara paling sederhana untuk mengecualikan postingan yang total suaranya kurang dari nol adalah seperti ini:
SELECT count(1)
FROM qanda question
JOIN qanda answer ON question.Id = answer.related
WHERE answer.related IS NOT NULL
AND answer.user_id = 2
AND question.free IS NULL
AND question.id not in (
select post_id
from votes
group by post_id
having sum(value) < 0)
Bagian kuncinya di sini adalah having sum(value) < 0
yang memilih postingan dengan suara negatif bersih.
Dari komentar...
Untuk menemukan pengguna yang memiliki terlalu banyak jawaban "buruk", Anda mungkin harus mengembalikan berapa banyak jawaban "baik" yang mereka buat dan memutuskan apakah secara keseluruhan mereka adalah pengguna "buruk". Misalnya, pengguna yang memiliki 5 jawaban yang semuanya buruk sangat berbeda dengan pengguna dengan 1000 jawaban yang hanya 5 jawaban buruk, meskipun keduanya memiliki 5 jawaban buruk.
Coba ini:
select
sum(score < 0) bad,
count(*) total,
sum(score < 0) / sum(.01) percent_bad
from (
SELECT coalesce(sum(value), 0) score
FROM qanda question
JOIN qanda answer ON question.Id = answer.related
LEFT JOIN votes ON votes.post_id = answer.id
WHERE answer.related IS NOT NULL
AND answer.user_id = 2
AND question.free IS NULL
AND answer.timestamp > subdate(now(), 365)
GROUP BY answer.id
) scores
Beberapa catatan tentang beberapa SQL Kung Fu di sana:
- di MySQL, benar adalah 1 dan salah adalah 0, jadi dengan menjumlahkan suatu kondisi, Anda menghitung berapa kali itu benar. Ini jauh lebih sederhana untuk dikodekan, dan lebih mudah dibaca, daripada
SUM(CASE ...)
yang kikuk ekspresi yang dibutuhkan oleh DB lain - menyelam hitungan dengan
SUM(.01)
(yang baru saja saya pikirkan tentang BTW) adalah cara terpendek untuk mendapatkan persentase, karena tidak hanya menyederhanakan ekspresi, tetapi juga menyatukan jawaban untuk mengambang sehingga Anda secara otomatis menghindari pembulatan aritmatika bilangan bulat
Penafian:Kode mungkin tidak dapat dikompilasi atau tidak berfungsi saat dimasukkan ke dalam ponsel saya (tetapi ada kemungkinan besar kode tersebut akan berfungsi)