Det enklaste sättet att utesluta inlägg vars totala röster är mindre än noll är så här:
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)
Nyckeldelen här är att having sum(value) < 0
som väljer inlägg med negativa röster netto.
Från kommentarer...
För att hitta användare som har för många "dåliga" svar, bör du förmodligen returnera hur många "bra" svar de har gjort och bestämma om de totalt sett är en "dålig" användare. Till exempel, en användare som har 5 svar som alla är dåliga skiljer sig mycket från en användare med 1000 svar varav endast 5 är dåliga, även om de båda har 5 dåliga svar.
Prova detta:
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
Ett par anteckningar om SQL Kung Fu där:
- i MySQL är sant 1 och falskt är 0, så genom att summera ett villkor räknar du hur många gånger det är sant. Detta är mycket enklare att koda och lättare att läsa än den klumpiga
SUM(CASE ...)
uttryck som behövs av andra DB - dyka en räkning med
SUM(.01)
(vilket jag precis tänkte på förresten) är det kortaste sättet att få en procentsats, eftersom det inte bara förenklar uttrycket, utan låter svaret flyta så att du automatiskt undviker aritmetisk heltalsavrundning
Ansvarsfriskrivning:Koden kanske inte kompileras eller fungerar som den tummades in på min telefon (men det finns en rimlig chans att det kommer att fungera)