Mysql
 sql >> Datenbank >  >> RDS >> Mysql

SQL-Abfrage, um zu zählen, wie oft bestimmte Werte in mehreren Zeilen vorkommen

Ja. was du hast, sollte funktionieren. (Sie müssen der abgeleiteten Tabelle einen Alias ​​hinzufügen, die Fehlermeldung, die Sie erhalten, sollte selbsterklärend sein. Einfach zu beheben, fügen Sie einfach ein Leerzeichen und den Buchstaben c (oder einen beliebigen Namen) am Ende Ihrer Abfrage hinzu.

Es gibt einen Vorbehalt hinsichtlich der Möglichkeit eines doppelten (VoterID, ElectionID) Tupel.

Wenn Sie eine eindeutige Einschränkung für (VoterID, ElectionID) haben, funktioniert Ihre Abfrage einwandfrei.

Wenn Sie keine eindeutige Einschränkung haben (die doppelte (VoterID, ElectionId) verbietet ), dann besteht die Möglichkeit, dass ein Wähler mit zwei (2) Zeilen für ElectionID 1 und ohne Zeilen für ElectionID 2 ... für diesen Wähler in die Zählung aufgenommen wird. Und ein Wähler, der zweimal in ElectionID 1 und nur einmal in ElectionID 2 gewählt hat, wird dieser Wähler von der Zählung ausgeschlossen.

Das Einfügen des Schlüsselworts DISTINCT in COUNT würde dieses Problem beheben, z. B.

HAVING COUNT(DISTINCT ElectionID) = 2

Ich würde die Abfrage anders schreiben, aber was Sie haben, wird funktionieren.

Um die Anzahl der VoterIDs zu erhalten, die sowohl an ElectionID 1 als auch an ElectionID2 teilgenommen haben, würde ich für eine verbesserte Leistung die Verwendung einer Inline-Ansicht vermeiden (MySQL nennt sie eine abgeleitete Tabelle). Ich würde die Abfrage stattdessen eine JOIN-Operation verwenden lassen. Etwa so:

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

Wenn Ihnen garantiert ist, dass (voterID, ElectionID) eindeutig ist, dann könnte die Auswahl einfacher sein:

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