Autor
|
Tema: MySQL, reporte "Registros duplicados" (Solucionado) (Leído 80,542 veces)
|
AlbertoBSD
Programador y
Moderador Global
Desconectado
Mensajes: 3.705
🏴 Libertad!!!!!
|
Bien, he generado ya un reporte que me ayuda con eso y tarda algo con la Base de datos de 7000 Registros, unos 3 minutos. Bien para no hacerla larga la BD es originalemente de MS Access, yo la migre a MySQL por comodidad. Hay una tabla que no tiene primary key, y contiene algunos registros duplicados, y quiero encontralos Son 2 campos los que tengo que validar al mismo tiempo. Id y grupo ambos son varchar(10) La condion es que en cada grupo no debe de existir ID repetidos. y en general puede exisistir mas de un mismo ID, siempre y cuando sean de grupos distintos. Anterior mente realize una consulta que mencione pero solo lo he logrado hacer para el ID, no he podido combinarla para el Grupo: SELECT * FROM tabla WHERE id IN (SELECT id FROM tabla AS x GROUP BY id HAVING COUNT(*)>1 AND tabla.id=x.id) ORDER BY id;
Sinceramente eso me fuciona, solo que hay veces que me muestra los Registros con ID Igual pero de diferente grupo, quisiera poder extender la busqueda para que tome en consideracion los 2, alguna idea ?
Solucion completa en: Re: MySQL, reporte "Registros duplicados" (Solucionado)Compara y da un reporte de registros duplicados en 2 Campos, en una misma Tabla, con mas de ~50K Registros, en menos de 2 o un segundo.
|
|
« Última modificación: 14 Febrero 2009, 02:50 am por Anon »
|
En línea
|
|
|
|
^Tifa^
Desconectado
Mensajes: 2.804
|
Sobre tu tabla que no tiene Primary Key, tranquilo, esto no es una desventaja solamente en cuanto a optimizacion de busquedad es todo... Pero si tanto te perjudica o molesta esto, sencillamente creale un indice a esa tabla, seleccionare ID como ejemplo :
mysql> alter table tabla add primary key(ID);
Asi ID sera tu primary key...
No comprendo del todo bien que quieres hacer, dices que en cada campo GRUPO no puede existir ID repetidos... haz pensado utilizar la clausula DISTINCT???
Por ejemplo... luego dices que puede existir o repetirse el mismo ID??? siempre y cuando sean de GRUPO distintos??? algo asi como :
select GRUPO, ID from tabla where GRUPO IN(select distinct(GRUPO) from tabla) ?????
Luego pones una consulta donde agrupas por ID.. y dices que te devuelve todos los registros iguales (lo cual es normal si usas GROUP BY) con distintos GRUPO...
Agradeceria poder comprenderte un pelin mejor. Porque ando un poco perdida en tu solicitud.
|
|
« Última modificación: 12 Noviembre 2008, 17:33 pm por ^TiFa^ »
|
En línea
|
|
|
|
AlbertoBSD
Programador y
Moderador Global
Desconectado
Mensajes: 3.705
🏴 Libertad!!!!!
|
Muchas gracias por responder, voy a verificar lo que dices y leer la documentacion de las clausulas que me pasaste.
Explico mejor:
Existen registro con muy variados ID, en algunas ocasiones se puede encontrar mas de un mismo ID, y esto solo es valido si y solo si pertencen a grupos Distintos. En dado caso de exista 2 registros con el mismo ID y el mismo Grupo se considera Repetido, y esos son los que quiero encontrar.
Saludos y gracias.
|
|
|
En línea
|
|
|
|
^Tifa^
Desconectado
Mensajes: 2.804
|
Ahh quieres encontrar cuales campos estan repetidos bueno No se si podre ayudarte mucho aqui, pero intentare. Para verificar cuales campos estan repetidos y que cantidad de veces haz esto : select grupo, count(grupo) as total from tabla group by grupo union all select id, count(id) as totalisimo from tabla group by id;
Esto te dara como resultado cuales registros en GRUPO y ID se repiten y cuantas veces se repiten gracias al COUNT es lo que se me ocurre mas rapidamente.... Haber si te sirve de algo.
|
|
|
En línea
|
|
|
|
^Tifa^
Desconectado
Mensajes: 2.804
|
Aqui tengo otra consulta SQL que puede ayudarte, esta me la paso un amigo aca no salio particularmente de mi. Espero que te sirva tambien Esta lo que hace es mostrarte explicitamente (Aunque no cuantas veces) se duplica una palabra dentro de la tabla. SELECT GRUPO FROM TABLA GROUP BY GRUPO HAVING COUNT(*) > 1;
|
|
|
En línea
|
|
|
|
AlbertoBSD
Programador y
Moderador Global
Desconectado
Mensajes: 3.705
🏴 Libertad!!!!!
|
Bien nuevamente gracias por las respuestas y por su tiempo Revice las consultas select grupo, count(grupo) as total from tabla group by grupo union all select id, count(id) as totalisimo from tabla group by id; Es buena la consulta de hecho es muy parecida a: SELECT id, COUNT(*) FROM tabla GROUP BY id;
junto a la que me los muestra por grupo: mmm union all aaa de hecho es eso Es me muestra Todos los registros que tengo XD. Mencione en el principio una consulta que utilizo: Y la siguiente: SELECT GRUPO FROM TABLA GROUP BY GRUPO HAVING COUNT(*) > 1;
Es como la primera. que mostraste sin el union y no me dice cuantos hay de cada uno. Ahora: select GRUPO, ID from tabla where GRUPO IN(select distinct(GRUPO) from tabla) ?????
Ahora mencione una consulta que uso SELECT * FROM tabla WHERE id IN (SELECT id FROM tabla AS x GROUP BY id HAVING COUNT(*)>1 AND tabla.id=x.id) ORDER BY id;
Esta me muestra exclusivamente los registros que estan duplicados en el ID , pero como lo menciono en esta tabla pueden existir registros duplicados en el ID Yo quiero extender esta consulta, a que ahi mismo borre cuando el grupo es Diferente. Ya tengo como 2 semanas buscando la forma de hacer esto y creeeme que he leido la documentacion bastante tiempo pero es por decir algo, una consulta muy compleja Espero encontrar la solucion y postear el resultado que a mas de algun incauto le va a servir como ami. La consulta que mostre si me funciona, solo que tengo que estar revisando visualmente que el grupo sea Distinto. Saludos y Muchisimas gracias.
|
|
|
En línea
|
|
|
|
^Tifa^
Desconectado
Mensajes: 2.804
|
Mi nino, una solucion no es rendirse ante un problema. Si tienes un problema, se trata de buscar la solucion solo eso. Yo entendi en tu post que tu decias que querias saber cuantas veces se duplicaba ID y GRUPO, por esa razon te publique : select grupo, count(grupo) as total from tabla group by grupo union all select id, count(id) as totalisimo from tabla group by id;
Yo se que aca se presentaran todos los registros, pero en el alias total y totalisimo te debe indicar cuantas veces se duplican cada uno.. de igual manera esta consulta : select grupo, count(grupo) as total from ejemplo group by grupo having count(*) > 1;
La anterior lo que hace es devolverte cada registro duplicado dentro de GRUPO al decir duplicado me refiero a mayor que 1 vez, en la sentencia anterior te lanze cuales registros de GRUPO se duplican y cuantas veces.... Tu lo dijiste claro :: En dado caso de exista 2 registros con el mismo ID y el mismo Grupo se considera Repetido, y esos son los que quiero encontrar. Querias saber cuantas veces se duplican GRUPO y ID forma de sobra creo que te he explicado.
|
|
|
En línea
|
|
|
|
AlbertoBSD
Programador y
Moderador Global
Desconectado
Mensajes: 3.705
🏴 Libertad!!!!!
|
Jaja.. Valla que tienes razon, ahora Mi nino, una solucion no es rendirse ante un problema.
Espero encontrar la solucion y postear el resultado que a mas de algun incauto le va a servir como ami.
No me he rendido, estoy busque y busque, como la pelicula Taken -> En español, Busqueda Implacable . Si tienes razon, no me doy mucho a entender. igualmente muchas gracias por tu valioso tiempo. Saludos
|
|
|
En línea
|
|
|
|
^Tifa^
Desconectado
Mensajes: 2.804
|
De verdad no se en totalidad que es lo que quieres primero dices : Existen registro con muy variados ID, en algunas ocasiones se puede encontrar mas de un mismo ID, y esto solo es valido si y solo si pertencen a grupos Distintos. En dado caso de exista 2 registros con el mismo ID y el mismo Grupo se considera Repetido, y esos son los que quiero encontrar. Creo que ya sabes como buscar ID y GRUPO duplicados dentro de una tabla. Luego dices que estas conforme con tu consulta que solo muestra los ID duplicados y que : Yo quiero extender esta consulta, a que ahi mismo borre cuando el grupo es Diferente. Ahora si quieres borrar debes poner el SELECT primero y luego acondicionarlo con WHERE para el DELETE, pero esto no tiene mucha logica, si conoces los registros ya duplicados mejor borralos de paso no???? DELETE FROM TABLA WHERE ID IN(X) AND GRUPO IN(X);
|
|
« Última modificación: 12 Noviembre 2008, 19:15 pm por ^TiFa^ »
|
En línea
|
|
|
|
AlbertoBSD
Programador y
Moderador Global
Desconectado
Mensajes: 3.705
🏴 Libertad!!!!!
|
^TiFa^ , en los pocos post que he compartido con tigo has demostrado siempre tratar de ayudar, y eso se te agradece enormemente. Vuelvo a repetir, muchas veces no me doy a entender, pero a ver si lo explico ahora con codigo a ver si nos entendemos va. DROP DATABASE IF EXISTS `db`; CREATE DATABASE `db`; USE db; DROP TABLE IF EXISTS `tabla`; CREATE TABLE tabla ( id VARCHAR(10) NULL, grupo VARCHAR(10) NULL ); DELIMITER $$ DROP PROCEDURE IF EXISTS `addRegistro` $$ CREATE PROCEDURE `addRegistro`(IN i VARCHAR(10),IN g VARCHAR(10)) BEGIN INSERT INTO tabla (id,grupo) VALUES(i,g); END $$ DELIMITER ; CALL addRegistro('1','1'); CALL addRegistro('2','1'); CALL addRegistro('3','1'); CALL addRegistro('4','1'); CALL addRegistro('4','1'); CALL addRegistro('1','2'); CALL addRegistro('2','2'); CALL addRegistro('3','2'); CALL addRegistro('4','2'); CALL addRegistro('5','2'); CALL addRegistro('6','2'); CALL addRegistro('7','2');
Bien ya temos el ejemplo de prueba. Ahora cuando yo ejecuro mi consulta: SELECT * FROM tabla WHERE id IN (SELECT id FROM tabla AS x GROUP BY id HAVING COUNT(*)>1 AND tabla.id=x.id) ORDER BY id;
Obtengo el siguiente resultado. id grupo 1 1 1 2 2 1 2 2 3 1 3 2 4 1 4 1 4 2
Cuando digo extender la consulta anterior, yo desearia que solo me indicase: id grupo 4 1 4 1
Solo los que se repiten. Cuando mensione que la consulta que hago si me sirve, en realidad si sirve, pero tengo que comprar visualmente, cuales son los que en verdad se repite el id y el grupo, y ese es el facto que quiero eliminar. ^TiFa^, un cordial saludo, de antemano gracias por el tiempo que te estas tomando en leerme (^^.)Saludos.
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
["SOLUCIONADO"]Libreria mysql-connector-java-5.1.14-bin para BD.
Java
|
NetJava
|
4
|
9,064
|
2 Marzo 2011, 13:27 pm
por NetJava
|
|
|
[Registros] En vez de poner en "run" un programa, añadir un comando(Solucionado)
Windows
|
moikano→@
|
2
|
4,180
|
3 Abril 2011, 12:56 pm
por moikano→@
|
|
|
Como recorrer registros asi : "Inicio - Siguiente - Anterior - Final" ???
PHP
|
Lupin
|
5
|
6,261
|
14 Mayo 2011, 22:24 pm
por Lupin
|
|
|
¿ Cómo puedo evitar registros duplicados con PDO y SQL ? solucionado
Bases de Datos
|
soujirito
|
2
|
4,553
|
19 Diciembre 2017, 12:38 pm
por soujirito
|
|
|
convertir registros duplicados a columnas en una sabana de reporte en mariadb
Bases de Datos
|
Ron Bacardi
|
0
|
2,120
|
27 Noviembre 2020, 02:34 am
por Ron Bacardi
|
|