Wählen Sie aus, wo die Anzahl eines Feldes größer als eins ist


100

Ich möchte so etwas machen:

SELECT * 
  FROM db.table 
 WHERE COUNT(someField) > 1

Wie kann ich dies in MySql erreichen?

Antworten:


147

Verwenden Sie die HAVINGnot- WHEREKlausel für den Vergleich der Gesamtergebnisse.

Nehmen Sie die Abfrage zum Nennwert:

SELECT * 
  FROM db.table 
HAVING COUNT(someField) > 1

Idealerweise sollte GROUP BYin der HAVINGKlausel eine Definition für die ordnungsgemäße Bewertung enthalten sein, aber MySQL erlaubt versteckte Spalten aus der GROUP BY ...

Ist dies in Vorbereitung auf eine einzigartige Einschränkung someField? Sieht so aus, als sollte es sein ...


11
Benötigen Sie eine GROUP BYsicher (es sei denn, dies ist eine MySQL-Nicht-Standard-Sache)?
Martin Smith

@ Martin Smith: Die Abfrage wurde zum Nennwert durchgeführt. Problem mit GROUP BY behoben (inkl. Funktion für versteckte Spalten).
OMG Ponys

"Sieht so aus, als ob es sein sollte ..." Warum? Ich brauche eine Ausbildung in diesem Bereich :)
Dave

Dies gibt also die gesamte Tabelle zurück, wenn sie mehr als 2 Nicht-Null- someFieldWerte enthält, oder eine leere Ergebnismenge, wenn dies nicht der Fall ist.
Martin Smith

@ Dave: Wenn Sie in der Lage wären, fehlerhafte Daten regelmäßig zu überprüfen und zu korrigieren, möchten Sie dann nicht verhindern, dass die Situation überhaupt erst auftritt? MySQL implementiert eine eindeutige Einschränkung als Index - weitere Informationen finden Sie in der Dokumentation CREATE INDEX
OMG Ponies

18
SELECT username, numb from(
Select username, count(username) as numb from customers GROUP BY username ) as my_table
WHERE numb > 3

3
Die einzige Einschränkung hier (zumindest in MySQL Community Server (GPL) mit 5.1.46-Community) ist, dass "jede abgeleitete Tabelle einen eigenen Alias ​​haben muss", wodurch Sie wie folgt aussehen: SELECT username, numb from (Select username, zählen (Benutzername) als numb von Kunden GROUP BY username) als my_table WHERE numb> 3
D_K

14

Sie können dies auch mit einem Self-Join tun:

SELECT t1.* FROM db.table t1
JOIN db.table t2 ON t1.someField = t2.someField AND t1.pk != t2.pk

11

Bitte schön:

SELECT Field1, COUNT(Field1)
  FROM Table1 
 GROUP BY Field1
HAVING COUNT(Field1) > 1
ORDER BY Field1 desc

4

Einweg

SELECT t1.* 
FROM db.table t1
WHERE exists 
      (SELECT *
      FROM db.table t2 
      where t1.pk != t2.pk 
      and t1.someField = t2.someField)

1

Wie OMG Ponies sagte, ist die Haben-Klausel genau das, wonach Sie suchen. Wenn Sie jedoch gehofft haben, dass Sie diskrete Zeilen anstelle einer Zusammenfassung erhalten (das "Haben" erstellt eine Zusammenfassung), kann dies nicht in einer einzelnen Anweisung erfolgen. In diesem Fall müssen Sie zwei Anweisungen verwenden.


1
Nicht ganz richtig - verwenden Sie die GROUP BY, um zu manipulieren, was das HAVING verwendet.
OMG Ponys

1

Ich gebe ein Beispiel für Group By zwischen zwei Tabellen in SQL:

Select cn.name,ct.name,count(ct.id) totalcity from city ct left join country cn on ct.countryid = cn.id Group By cn.name,ct.name Having totalcity > 2



1

Für mich hat das Fehlen einer Gruppe nur ein leeres Ergebnis zurückgegeben. Ich denke, es ist ziemlich wichtig, eine Gruppe für die Aussage zu haben


-2

Es sollte auch erwähnt werden, dass das "pk" ein Schlüsselfeld sein sollte. Die Selbstverbindung

SELECT t1.* FROM db.table t1
JOIN db.table t2 ON t1.someField = t2.someField AND t1.pk != t2.pk 

von Bill Karwin geben Sie alle Aufzeichnungen, die Duplikate sind, was ich wollte. Da einige mehr als zwei haben, können Sie denselben Datensatz mehrmals erhalten. Ich habe alles in eine andere Tabelle mit denselben Feldern geschrieben, um dieselben Datensätze durch Unterdrückung von Schlüsselfeldern zu entfernen. Ich habe es versucht

SELECT * FROM db.table HAVING COUNT(someField) > 1

oben zuerst. Die von ihm zurückgegebenen Daten geben nur eines der Duplikate an, weniger als die Hälfte dessen, was Sie erhalten, aber die Anzahl ist gut, wenn das alles ist, was Sie wollen.


3
Dies ist keine wirkliche Antwort.
anon582847382
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.