Najprostszy sposób na wykluczenie postów, których łączna liczba głosów jest mniejsza niż zero, jest następujący:
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)
Kluczową częścią jest tutaj having sum(value) < 0
które wybierają posty z negatywnymi głosami netto.
Z komentarzy...
Aby znaleźć użytkowników, którzy mają zbyt wiele „złych” odpowiedzi, prawdopodobnie powinieneś zwrócić liczbę „dobrych” odpowiedzi, które udzielili, i zdecydować, czy ogólnie są „złymi” użytkownikami. Na przykład użytkownik, który ma 5 złych odpowiedzi, bardzo różni się od użytkownika z 1000 odpowiedziami, z których tylko 5 jest złych, mimo że obaj mają 5 złych odpowiedzi.
Spróbuj tego:
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
Kilka uwag na temat niektórych SQL Kung Fu:
- W MySQL prawda to 1, a fałsz to 0, więc sumując warunek, liczysz, ile razy jest on prawdziwy. Jest to znacznie prostsze do napisania i łatwiejsze do odczytania niż niezdarny
SUM(CASE ...)
wyrażenia potrzebne innym DB - Nurkowanie licznika przez
SUM(.01)
(o czym dopiero pomyślałem BTW) to najkrótszy sposób na uzyskanie wartości procentowej, ponieważ nie tylko upraszcza wyrażenie, ale także ujednolica odpowiedź na zmienne, dzięki czemu automatycznie unikasz zaokrąglania liczb całkowitych
Zastrzeżenie:kod może się nie skompilować lub nie działać tak, jak został wczytany na moim telefonie (ale jest rozsądna szansa, że zadziała)