La manière la plus simple d'exclure les publications dont le total des votes est inférieur à zéro est la suivante :
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)
La partie clé ici est le having sum(value) < 0
qui sélectionnent les messages avec des votes négatifs nets.
Des commentaires...
Pour trouver les utilisateurs qui ont trop de "mauvaises" réponses, vous devriez probablement renvoyer le nombre de "bonnes" réponses qu'ils ont faites et décider s'il s'agit globalement d'un "mauvais" utilisateur. Par exemple, un utilisateur qui a 5 réponses qui sont toutes mauvaises est très différent d'un utilisateur qui a 1000 réponses dont seulement 5 sont mauvaises, même s'ils ont tous les deux 5 mauvaises réponses.
Essayez ceci :
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
Quelques notes sur du SQL Kung Fu :
- dans MySQL, true vaut 1 et false vaut 0, donc en additionnant une condition, vous comptez combien de fois elle est vraie. C'est beaucoup plus simple à coder et plus facile à lire que le maladroit
SUM(CASE ...)
expressions requises par d'autres bases de données - diviser un compte par
SUM(.01)
(auquel je viens juste de penser à BTW) est le moyen le plus bref d'obtenir un pourcentage, car non seulement il simplifie l'expression, mais il fait flotter la réponse pour éviter automatiquement l'arrondi arithmétique entier
Avis de non-responsabilité :le code peut ne pas compiler ou fonctionner tel qu'il a été saisi sur mon téléphone (mais il y a une chance raisonnable qu'il fonctionne)