Mysql
 sql >> Database >  >> RDS >> Mysql

Query SQL per contare il numero di volte in cui determinati valori si verificano in più righe

Sì. quello che hai dovrebbe funzionare. (Dovrai aggiungere un alias sulla tabella derivata, il messaggio di errore che ricevi dovrebbe essere autoesplicativo. Facile da risolvere, basta aggiungere uno spazio e la lettera c (o qualsiasi nome tu voglia) alla fine della tua query.

C'è un avvertimento riguardo al potenziale duplicato di (VoterID, ElectionID) tuple.

Se hai un vincolo univoco su (VoterID, ElectionID), la tua query funzionerà correttamente.

Se non hai un vincolo univoco (che non consente (VoterID, ElectionId) duplicati ), quindi è possibile che un elettore con due (2) righe per ElectionID 1 e nessuna riga per ElectionID 2... venga incluso nel conteggio. E un elettore che ha votato due volte in ElectionID 1 e solo una volta in ElectionID 2, quell'elettore sarà escluso dal conteggio.

Includere la parola chiave DISTINCT all'interno di COUNT risolverebbe il problema, ad es.

HAVING COUNT(DISTINCT ElectionID) = 2

Scriverei la query in modo diverso, ma quello che hai funzionerà.

Per ottenere il conteggio di VoterID che ha partecipato sia a ElectionID 1 che a ElectionID2, per migliorare le prestazioni, eviterei di utilizzare una vista in linea (MySQL la chiama tabella derivata). Vorrei invece che la query utilizzasse un'operazione JOIN. Qualcosa del genere:

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

Se ti è garantito che (voterID, ElectionID) è unico, quindi la selezione potrebbe essere più semplice:

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