Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Consulta SQL para contar o número de vezes que determinados valores ocorrem em várias linhas


Sim. o que você tem deve funcionar. (Você precisará adicionar um alias na tabela derivada, a mensagem de erro que você receber deve ser auto-explicativa. Fácil de corrigir, basta adicionar um espaço e a letra c (ou o nome que você quiser) no final da sua consulta.

Há uma ressalva em relação ao potencial de (VoterID, ElectionID) duplicado tuplas.

Se você tiver uma restrição exclusiva em (VoterID, ElectionID), sua consulta funcionará bem.

Se você não tiver uma restrição exclusiva (que não permite duplicar (VoterID, ElectionId) ), existe a possibilidade de um eleitor com duas (2) linhas para ElectionID 1 e nenhuma linha para ElectionID 2... para que esse eleitor seja incluído na contagem. E um eleitor que votou duas vezes no ElectionID 1 e apenas uma vez no ElectionID 2, esse eleitor será excluído da contagem.

Incluir a palavra-chave DISTINCT dentro de um COUNT resolveria esse problema, por exemplo.
HAVING COUNT(DISTINCT ElectionID) = 2

Eu escreveria a consulta de forma diferente, mas o que você tem funcionará.

Para obter a contagem de VoterID que participou de ElectionID 1 e ElectionID2, para melhorar o desempenho, evitaria usar uma exibição em linha (o MySQL a chama de tabela derivada). Eu faria a consulta usar uma operação JOIN. Algo assim:
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 você tiver certeza de que (voterID, ElectionID) é único, então o select poderia ser mais simples:
SELECT COUNT(1) AS NumVoters
  FROM elections e1
  JOIN elections e2
    ON e2.voterID = e1.voterID
 WHERE e1.electionID = 1
   AND e2.electionID = 2