Den enkleste måde at ekskludere indlæg, hvis samlede stemmer er mindre end nul, er sådan her:
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)
Nøgledelen her er having sum(value) < 0
som vælger indlæg med netto negative stemmer.
Fra kommentarer...
For at finde brugere, der har for mange "dårlige" svar, bør du nok returnere, hvor mange "gode" svar de har lavet, og beslutte, om de samlet set er en "dårlig" bruger. For eksempel er en bruger, der har 5 svar, der alle er dårlige, meget anderledes end en bruger med 1000 svar, hvoraf kun 5 er dårlige, selvom de begge har 5 dårlige svar.
Prøv dette:
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
Et par noter om noget SQL Kung Fu derinde:
- i MySQL er sand 1 og falsk er 0, så ved at summere en betingelse tæller du, hvor mange gange den er sand. Dette er meget nemmere at kode og lettere at læse end den klodsede
SUM(CASE ...)
udtryk, der kræves af andre DB'er - tæller med
SUM(.01)
(som jeg kun lige tænkte på BTW) er den korteste måde at få en procentdel på, da det ikke kun forenkler udtrykket, men koncerterer svaret til at flyde, så du automatisk undgår heltal aritmetisk afrunding
Ansvarsfraskrivelse:Koden kompilerer eller virker muligvis ikke, som den blev slået ind på min telefon (men der er en rimelig chance for, at den vil virke)