somme () et compte ()

Envisager un système de vote mis en œuvre dans PostgreSQL, où chaque utilisateur peut voter en haut ou en bas sur un "foo". Il y a un foo table qui stocke toutes les "foo de l'information", et un votes de la table qui stocke les user_idfoo_idet votevote est +1 ou -1.

Pour obtenir le vote de pointage pour chaque foo, la requête suivante devrait fonctionner:

SELECT sum(vote) FROM votes WHERE foo.foo_id = votes.foo_id;

Mais, le suivant ne fonctionne tout aussi bien:

(SELECT count(vote) FROM votes 
 WHERE foo.foo_id = votes.foo_id 
 AND votes.vote = 1)
- (SELECT count(vote) FROM votes 
   WHERE foo.foo_id = votes.foo_id 
   AND votes.vote = (-1))

J'ai actuellement un index sur votes.foo_id.

Qui est une approche plus efficace? (En d'autres termes, ce qui permettrait de courir plus vite?)
Je suis intéressé par les deux PostgreSQL-réponse spécifique et le général SQL réponse.

MODIFIER

Beaucoup de réponses ont été en tenant compte le cas où vote est null. J'ai oublié de mentionner qu'il existe un NOT NULL contrainte sur le vote de la colonne.

Aussi, beaucoup ont souligné que le premier est beaucoup plus facile à lire. Oui, il est certainement vrai, et si un collègue a écrit le 2ème, je serais explose de rage, sauf si il y avait une performance nécessité. Jamais le moins, la question est toujours sur les performances des deux. (Techniquement, si la première requête a été façon plus lent, il ne serait pas un crime pour écrire la deuxième requête.)

source d'informationauteur ryanrhee