sql >> Base de Datos >  >> RDS >> Mysql

¿Seleccionar todas las filas duplicadas en función de una o dos columnas?

Una forma de lograr su resultado es usar una consulta anidada y tener una cláusula:en la consulta interna, seleccione aquellos que cuentan más de uno, y en la consulta externa, seleccione id:

Consulte el siguiente ejemplo para los criterios de selección de una sola columna:

Crear tabla:

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

Insertar tupla:

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

El resultado que necesitas:

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)

[RESPUESTA]

Pero como si su criterio de selección se basara en más de una columna, entonces puede usar JOIN.

Para explicarlo, estoy escribiendo una consulta de selección que crea una tabla intermedia que se usará en JOIN como segunda tabla de operandos.

La consulta es seleccionar todos los primeros nombres y columnas que se duplican con algunas de las otras filas:
Por ejemplo, seleccione las filas en las que first y last el nombre se repite

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)

Entonces solo tienes un par de first y last nombra esas repeticiones (o se duplica con algunas otras filas).

Ahora, la pregunta es:cómo seleccionar id de esta fila? Usa ¡Únete! de la siguiente manera:

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)

puede seleccionar sobre la base de tantas columnas como desee, p. una sola columna si desea usar unirse, luego elimine el apellido.