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

Requête SQL pour compter le nombre de fois que certaines valeurs se produisent dans plusieurs lignes

Oui. ce que vous avez devrait fonctionner. (Vous devrez ajouter un alias sur la table dérivée, le message d'erreur que vous obtenez devrait être explicite. Facile à corriger, ajoutez simplement un espace et la lettre c (ou le nom de votre choix) à la fin de votre requête.

Il y a une mise en garde concernant le potentiel de duplication de (VoterID, ElectionID) tuples.

Si vous avez une contrainte unique sur (VoterID, ElectionID), votre requête fonctionnera correctement.

Si vous n'avez pas de contrainte unique (qui interdit le doublon de (VoterID, ElectionId) ), alors il est possible qu'un électeur avec deux (2) lignes pour ElectionID 1 et aucune ligne pour ElectionID 2... pour que cet électeur soit inclus dans le décompte. Et un électeur qui a voté deux fois dans ElectionID 1 et une seule fois dans ElectionID 2, cet électeur sera exclu du décompte.

Inclure le mot-clé DISTINCT dans un COUNT résoudrait ce problème, par exemple

HAVING COUNT(DISTINCT ElectionID) = 2

J'écrirais la requête différemment, mais ce que vous avez fonctionnera.

Pour obtenir le nombre de VoterID qui ont participé à la fois à ElectionID 1 et ElectionID2, pour de meilleures performances, j'éviterais d'utiliser une vue en ligne (MySQL l'appelle une table dérivée). Je demanderais à la requête d'utiliser une opération JOIN à la place. Quelque chose comme ça :

SELECT COUNT(DISTINCT e1.voterID) AS NumVoters
  FROM elections e1
  JOIN elections e2
    ON e2.voterID = e1.voterID
 WHERE e1.electionID = 1
   AND e2.electionID = 2

Si vous êtes assuré que (voterID, ElectionID) est unique, alors la sélection pourrait être plus simple :

SELECT COUNT(1) AS NumVoters
  FROM elections e1
  JOIN elections e2
    ON e2.voterID = e1.voterID
 WHERE e1.electionID = 1
   AND e2.electionID = 2