Cách đơn giản nhất để loại trừ các bài đăng có tổng số phiếu bầu nhỏ hơn 0 là như sau:
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)
Phần quan trọng ở đây là having sum(value) < 0
chọn các bài đăng có số phiếu tiêu cực ròng.
Từ nhận xét ...
Để tìm những người dùng có quá nhiều câu trả lời "xấu", bạn có thể nên trả lại bao nhiêu câu trả lời "tốt" mà họ đã trả lời và quyết định xem họ có phải là người dùng "xấu" hay không. Ví dụ:một người dùng có 5 câu trả lời đều không tốt, rất khác với người dùng có 1000 câu trả lời, trong đó chỉ có 5 câu trả lời không tốt, mặc dù cả hai đều có 5 câu trả lời không tốt.
Hãy thử điều này:
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
Một số lưu ý về một số Kung Fu SQL trong đó:
- trong MySQL, true là 1 và false là 0, do đó, bằng cách tính tổng một điều kiện, bạn đếm xem nó đúng bao nhiêu lần. Điều này đơn giản hơn để viết mã và dễ đọc hơn nhiều so với
SUM(CASE ...)
vụng về các biểu thức cần thiết bởi các DB khác - giảm số lượng theo
SUM(.01)
(mà tôi chỉ nghĩ đến BTW) là cách ngắn gọn nhất để lấy tỷ lệ phần trăm, vì nó không chỉ đơn giản hóa biểu thức mà còn kết hợp câu trả lời thành float để bạn tự động tránh làm tròn số nguyên
Tuyên bố từ chối trách nhiệm:Mã có thể không được biên dịch hoặc hoạt động như đã được cài đặt trên điện thoại của tôi (nhưng có khả năng hợp lý là nó sẽ hoạt động)