De eenvoudigste manier om berichten uit te sluiten waarvan het totale aantal stemmen minder dan nul is, is als volgt:
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)
Het belangrijkste onderdeel hier is de having sum(value) < 0
die berichten selecteren met netto negatieve stemmen.
Uit reacties...
Om gebruikers te vinden die te veel "slechte" antwoorden hebben, moet u waarschijnlijk teruggeven hoeveel "goede" antwoorden ze hebben gegeven en beslissen of ze over het algemeen een "slechte" gebruiker zijn. Een gebruiker die bijvoorbeeld 5 antwoorden heeft die allemaal slecht zijn, is heel anders dan een gebruiker met 1000 antwoorden waarvan er slechts 5 slecht zijn, ook al hebben ze allebei 5 slechte antwoorden.
Probeer dit:
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
Een paar opmerkingen over wat SQL Kung Fu daarin:
- in MySQL is waar 1 en onwaar is 0, dus door een voorwaarde op te tellen, tel je hoe vaak deze waar is. Dit is veel eenvoudiger te coderen en gemakkelijker te lezen dan de onhandige
SUM(CASE ...)
expressies die andere DB's nodig hebben - duiken met
SUM(.01)
(waar ik net aan dacht btw) is de kortste manier om een percentage te krijgen, omdat het niet alleen de uitdrukking vereenvoudigt, maar het antwoord ook laat zweven zodat je automatisch gehele rekenkundige afrondingen vermijdt
Disclaimer:de code wordt mogelijk niet gecompileerd of werkt niet zoals deze op mijn telefoon is ingevoerd (maar er is een redelijke kans dat het werkt)