Mysql
 sql >> Base de données >  >> RDS >> Mysql

Sélectionner toutes les lignes en double basées sur une ou deux colonnes ?

Une façon d'obtenir votre résultat consiste à utiliser une requête imbriquée et une clause have :dans la requête interne, sélectionnez ceux qui en comptent plus d'un, et dans la requête externe, sélectionnez l'identifiant :

Vérifiez l'exemple suivant pour les critères de sélection de colonne unique :

Créer un tableau :

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

Insérer un tuple :

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

Le résultat dont vous avez besoin :

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)

[RÉPONSE]

Mais comme si vos critères de sélection étaient basés sur plusieurs colonnes, vous pouvez utiliser JOIN.

Pour l'expliquer, j'écris une requête de sélection qui crée une table intermédiaire qui sera utilisée dans JOIN comme deuxième table d'opérandes.

La requête consiste à sélectionner tous les premiers noms et à mettre en colonne ces doublons avec d'autres lignes :
Par exemple, sélectionnez les lignes dans lesquelles first et last le nom se répète

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)

Vous n'avez donc qu'une seule paire de first et last nomme ces répétitions (ou est en double avec d'autres lignes).

Maintenant, la question est :comment sélectionner id de cette ligne ? Utilisez Rejoindre ! comme suit :

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)

vous pouvez sélectionner sur la base d'autant de colonnes que vous le souhaitez, par ex. une seule colonne si vous souhaitez utiliser la jointure, puis supprimez le nom de famille.