Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment puis-je compter le nombre de messages qui ont un score de vote nul ou positif ?

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)