MySQL, reporte "Registros duplicados" (Solucionado)

Iniciado por AlbertoBSD, 12 Noviembre 2008, 17:00 PM

0 Miembros y 1 Visitante están viendo este tema.

AlbertoBSD

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:

Código (sql) [Seleccionar]
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.
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

^Tifa^

#1
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.


AlbertoBSD

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.
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

^Tifa^

Ahh quieres encontrar cuales campos estan repetidos bueno  :rolleyes:

No se si podre ayudarte mucho aqui, pero intentare.

Para verificar cuales campos estan repetidos y que cantidad de veces haz esto :

Citar
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.

^Tifa^

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.

Citar
SELECT GRUPO
FROM TABLA
GROUP BY GRUPO
HAVING COUNT(*) > 1;

AlbertoBSD

Bien nuevamente gracias por las respuestas y por su tiempo :D

Revice las consultas

Citarselect 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:

Código (sql) [Seleccionar]
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 :xD

Es me muestra Todos los registros que tengo XD.

Mencione en el principio una consulta que utilizo:

Y la siguiente:
Citar
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:

Cita de: ^TiFa^ en 12 Noviembre 2008, 17:28 PM
select GRUPO, ID from tabla where GRUPO IN(select distinct(GRUPO) from tabla) ?????

Ahora mencione una consulta que uso

Cita de: Anon en 12 Noviembre 2008, 17:00 PM

Código (sql) [Seleccionar]
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.
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

^Tifa^

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 :

Citar
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 :

Citar
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 ::

CitarEn 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.

AlbertoBSD

Jaja.. :xD

Valla que tienes razon, ahora

Cita de: ^TiFa^ en 12 Noviembre 2008, 18:39 PM
Mi nino, una solucion no es rendirse ante un problema.

Cita de: Anon en 12 Noviembre 2008, 18:04 PM
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 :xD.

Si tienes razon, no me doy mucho a entender. igualmente muchas gracias por tu valioso tiempo.

Saludos
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

^Tifa^

#8
De verdad no se en totalidad que es lo que quieres   :huh:   primero dices :

CitarExisten 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 :

CitarYo 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????

Citar
DELETE FROM TABLA WHERE ID IN(X) AND GRUPO IN(X);

AlbertoBSD

^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.

Código (sql) [Seleccionar]

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:

Código (sql) [Seleccionar]

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.

Citar
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:
Citar
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.
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW