sql >> Database teknologi >  >> RDS >> Mysql

Vælge alle dublerede rækker baseret på en eller to kolonner?

En måde at opnå dit resultat på er at bruge indlejret forespørgsel og have-klausul:I indre forespørgsel skal du vælge dem, der tæller mere end én, og i den ydre forespørgsel skal du vælge id:

Tjek følgende eksempel for udvælgelseskriterier for enkelt kolonne:

Opret tabel:

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

Indsæt tupel:

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

Resultatet du skal bruge:

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)

[SVAR]

Men som om dine udvælgelseskriterier er baseret på mere end én kolonne, så kan du gøre brug af JOIN.

For at forklare det skriver jeg en udvælgelsesforespørgsel, der opretter en mellemtabel, der vil blive brugt i JOIN som anden operandtabel.

Forespørgslen er at vælge alle første navne og kolonner for disse dubletter med nogle af andre rækker:
Vælg f.eks. rækker, hvor first og last navnet gentager sig

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)

Så du har kun ét par first og last navngiver disse gentagelser (eller er dubletter med nogle andre rækker).

Nu er spørgsmålet:hvordan vælger man id af denne række? Brug Deltag! som følger:

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)

du kan vælge ud fra så mange kolonner du vil f.eks. enkelt kolonne, hvis du vil bruge join, så fjern efternavn.



  1. MySQL pivottabeller - rækker til kolonner. Forespørgsel

  2. Sådan formateres tal som romertal i Oracle

  3. Markør i procedure, der returnerer flere værdier end forespørgsel

  4. Opretter forbindelse til Postgresql i en docker-container udefra