Buscar registros repetidos tabla MySQL [Completo]
Buscar registros repetidos y lo mostraremos para darle una solución
Buscar registros repetidos tabla MySQL. Este código SQL sirve buscar si dentro de una determinada tabla hay campos repetidos. Además, vamos a contar el total de registros duplicados, con una sentencia muy sencilla.
En este artículo realizaremos dos ejemplos para buscar duplicados y lo mostraremos a través de una consulta. Sin embargo, también le daremos solución para que no vuelva a ocurrir.
¿Qué sentencia se usará en el ejemplo?
Por ejemplo, para lograr nuestro objetivo usaremos:
- Select : se utiliza para mostrar datos.
- Count : se utiliza para contar los resultados de una consulta.
- Group by : se utiliza para agrupar los resultados de una consulta.
- Having : se utiliza para incluir condiciones con alguna función SQL del tipo SUM, MAX,etc.
Ahora, la idea es implementar estas sentencias en una de nuestras tablas para hallar los registros duplicados que a veces genera errores cuando deseamos relacionar tablas.
Buscar registros repetidos tabla MySQL
Vamos a suponer que tenemos la siguiente tabla MySQL con los siguientes registros duplicados. Sin embargo, a simple vista no habría problema para corregir, pero el detalle esta cuando son miles de registros en la tabla mencionada.
id nombre 1 AAAA 2 BBBB 3 BBBB 4 BBBB 5 AAAA 6 CCCC 7 DDDD
Estructura de la tabla
CREATE TABLE `demo` ( `id` int(11) NOT NULL, `nombre` varchar(10) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; INSERT INTO `demo` (`id`, `nombre`) VALUES (1, 'AAAA'), (2, 'BBBB'), (3, 'BBBB'), (4, 'BBBB'), (5, 'AAAA'), (6, 'CCCC'), (7, 'DDDD'); ALTER TABLE `demo` ADD PRIMARY KEY (`id`); ALTER TABLE `demo` MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=8;
Consulta de duplicados
Con esta simple consulta podemos hallar los registros duplicados en nuestra tabla.
select nombre, count(nombre) c from demo group by nombre having c >1
Al ejecutar esta query obtendremos el siguiente resultado:
nombre | duplicados |
---|---|
AAAA | 2 |
BBBB | 3 |
Contar en total de registros duplicados
En el ejemplo anterior los nombres duplicados son AAAA y BBBB. Ahora, nos piden el resultado total de duplicados, en este ejemplo seria 2 (AAA A y BBBB) para lograr este resultado solo debemos de agregar una sub consulta a la consulta inicial.
SELECT count(*) AS total_duplicados FROM ( SELECT nombre FROM demo GROUP BY nombre HAVING COUNT(nombre) > 1 ) as ver
Resultados de la consulta
total_duplicados |
---|
2 |
Ejemplo con una tabla «Clientes»
Esta consulta lo que hace es hacer contar usando la sentencia “count” de los resultados de la consulta interna.
CREATE TABLE `clientes` ( `id` int(11) NOT NULL, `nombres` varchar(100) NOT NULL, `apellidos` varchar(100) NOT NULL, `telefono` varchar(100) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; INSERT INTO `clientes` (`id`, `nombres`, `apellidos`, `telefono`) VALUES (1, 'Luis', 'Perez', '600100100'), (2, 'Antonio', 'Perez', '699230671'), (3, 'Marcos', 'Fernandez', '600100100'), (4, 'Luis', 'Perez', '699230671'), (5, 'Pedro', 'Sanchez', '600100100'), (6, 'Ana', 'Alvarez', '876123000'), (7, 'Maria', 'Garcia', '902130823'), (8, 'Victor', 'Prado', '654100601'), (9, 'Carlos', 'Sandoval', '600100100');
Mostrar Clientes Repetidos
Para ver su uso, un ejemplo: en tabla llamada «clientes» con 4 campos (id, nombre, apellidos, telefono), queremos averiguar si hay registros con el teléfono:
-- Telefonos repetidos SELECT telefono FROM clientes GROUP BY telefono HAVING COUNT(*)>1; -- Resultado -- 699230671 -- 600100100
Lo que necesitamos es agrupar los registros por un valor que deseamos buscar los registros repetidos y con la sentencia HAVING COUNT(*)>1 mostrara los valores repetidos mayores a uno.
-- Nº de veces que esta repetido cada telefono SELECT telefono, count(*) FROM clientes GROUP BY telefono HAVING COUNT(*)>1; -- Resultado -- telefono count -- 699230671 2 -- 600100100 4
Con este código sql podremos averiguar si existen valores repetidos en una tabla, y si los hay, contarlo .
Buscar registros NO repetidos en MYSQL
Podemos realizar del mismo modo que se buscan los repetidos se puede saber los que no se repiten. Sin emabrgo, solo hay que cambiar <1 por =1 para tener los clientes que son unicos.
-- Usuarios con telefono unico SELECT telefono, COUNT(*) as num_repeticiones FROM clientes u GROUP BY telefono HAVING COUNT(*)=1; -- Resultado -- telefono num_repeticiones -- 902130823 1 -- 654100601 1 -- 876123000 1
Borrar registros repetidos en SQL
Para dar solución al problema de registros duplicados podemos borrar todos los registros repetidos basta con usar la sentencia DELETE a la consulta que nos devuelve los registros repetidos.
-- Borrar todos los repetidos DELETE FROM clientes WHERE telefono IN (SELECT telefono FROM clientes GROUP BY telefono HAVING COUNT(*)>1);
NOTA IMPORTANTE:
Si deseamos realizar consultas de borrado, siempre es recomendable sacar una copia de seguridad de la tabla o base de datos.
Solución para evitar registros duplicados
Prmeramente tenemos que eliminar los registros duplicados, caso contrario no podremos aplicar esta estrategia.
La restricción UNIQUE asegura que todos los valores de una columna sean diferentes.
Tanto las restricciones UNIQUE como PRIMARY KEY proporciona una garantía de unicidad para una columna o un conjunto de columnas.
Ejemplo
ALTER TABLE `clientes` ADD UNIQUE(`telefono`);
Con esta consulta le estamos diciendo a MySQL que la columna telefono no debe de aceptar registros duplicado y emitirá un mensaje de error.
Otra solución es usando un lenguaje de programación PHP que al insertar busca en la tabla y si la consulta es satisfactoria no insertara el registro.
CONCLUSION DEL ARTICULO
- Hemos aprendido a usar la sentencia Having para hallar registros duplicados y con dos ejemplos le hemos dado solución.
- Además, hemos aprendido a mostrar duplicados, ver registros únicos, borrar duplicados, contar el total de registros duplicados en una tabla.
- Por último, hemos aprendido a dar solución a los registros duplicado, por base de datos y lenguaje de programación.
Sí, estamos trabajando con base de datos de producción siempre sacar una copia de seguridad por precaución y por tener un respaldo por algún error de consultas.
Hola Néstor, estoy haciendo mi primera base de datos que consiste en libros leídos y no leído, pero la verdad no se como hacerlo.
Podrás ayudarme?
¿Cómo sería si se desea obtener el ID de los registros duplicados?
Excelente info. Pero, y si en una sola pantalla quiero mostrar tanto los repetidos como los NO repetidos en orden alfabetico? Y claro, la cantidad de veces repetido a un costado.
AAAA – 2
BBBB – 3
CCCC – 1
DDDD – 1