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

Alle doppelten Zeilen basierend auf einer oder zwei Spalten auswählen?

Eine Möglichkeit, Ihr Ergebnis zu erzielen, ist die Verwendung einer verschachtelten Abfrage und einer Having-Klausel:Wählen Sie in der inneren Abfrage diejenigen aus, die mehr als eins zählen, und in der äußeren Abfrage die ID:

Überprüfen Sie das folgende Beispiel für Auswahlkriterien für einzelne Spalten:

Tabelle erstellen:

CREATE TABLE `person` (
    `id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY,
    `first` varchar(120) NOT NULL,
    `last` varchar(120) NOT NULL
);

Tupel einfügen:

INSERT INTO `person` ( `first`, `last`) VALUES
("mukta", "chourishi"),
("mukta", "chourishi"),
("mukta", "john"),
("carl", "thomas" );

Das Ergebnis, das Sie brauchen:

mysql> SELECT  `id` 
    -> FROM `person` 
    -> WHERE `first`=(SELECT `first` FROM `person` HAVING COUNT(`first`) > 1);
+----+
| id |
+----+
|  1 |
|  2 |
|  3 |
+----+
3 rows in set (0.00 sec)

[ANTWORT]

Aber als ob Ihre Auswahlkriterien auf mehr als einer Spalte basieren, können Sie JOIN verwenden.

Um es zu erklären, schreibe ich eine Auswahlabfrage, die eine Zwischentabelle erstellt, die in JOIN als zweite Operandentabelle verwendet wird.

Die Abfrage besteht darin, alle Vornamen auszuwählen und diese Duplikate mit einigen anderen Zeilen zu spalten:
Zum Beispiel Zeilen auswählen, in denen first und last Name wiederholt sich

mysql> SELECT `first`, `last`,  count(*)  as rows 
    -> FROM `person` 
    -> GROUP BY `first`, `last` 
    -> HAVING count(rows) > 1;
+-------+-----------+------+
| first | last      | rows |
+-------+-----------+------+
| mukta | chourishi |    2 |
+-------+-----------+------+
1 row in set (0.00 sec)

Sie haben also nur ein Paar first und last benennt diese Wiederholungen (oder ist Duplikate mit einigen anderen Zeilen).

Nun stellt sich die Frage:Wie wählt man id aus dieser Reihe? Verwenden Sie beitreten! wie folgt:

mysql> SELECT  p1.`id`
    -> FROM `person` as p1
    -> INNER JOIN (
    ->     SELECT `first`, `last`,  count(*)  as rows
    ->     FROM `person` 
    ->     GROUP BY `first`, `last` 
    ->     HAVING count(rows) > 1) as p
    -> WHERE p.`first` = p1.`first` and p.`last` = p1.`last`;  
+----+
| id |
+----+
|  1 |
|  2 |
+----+
2 rows in set (0.06 sec)

Sie können anhand beliebig vieler Spalten selektieren z.B. einzelne Spalte, wenn Sie Join verwenden möchten, dann entfernen Sie den Nachnamen.