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?

Stevebot
quelle

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 ...

OMG Ponys
quelle
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
dandy_sql
quelle
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
Bill Karwin
quelle
11

Bitte schön:

SELECT Field1, COUNT(Field1)
  FROM Table1 
 GROUP BY Field1
HAVING COUNT(Field1) > 1
ORDER BY Field1 desc
Nalan Madheswaran
quelle
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)
Martin Smith
quelle
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.

Brent Arien
quelle
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


user4551254
quelle
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

Maham Khan
quelle
-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.

Jim Blanchard
quelle
3
Dies ist keine wirkliche Antwort.
anon582847382