Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

eliminar registros duplicados mas antiguos según 2 campos

Estas en el tema de eliminar registros duplicados mas antiguos según 2 campos en el foro de Mysql en Foros del Web. hola a todos, aqui con otra consulta y como dice el titulo como puedo eliminar registros duplicados mas antiguos dependiendo de dos registros digamos de ...
  #1 (permalink)  
Antiguo 09/10/2013, 12:21
Avatar de giancarloffi  
Fecha de Ingreso: julio-2013
Mensajes: 63
Antigüedad: 10 años, 9 meses
Puntos: 0
Pregunta

hola a todos, aqui con otra consulta y como dice el titulo como puedo eliminar registros duplicados mas antiguos dependiendo de dos registros digamos de dni y nombre_tipoexa (nombre de tipo de examen) y eliminar los mas antiguos o seria los id menores, es que lo que pasa estos datos nuevos se vana ingresar por excel y en caso de que anteriormente ya se han ingresado por cuestiones que hace mese se tomaron examenes medicos y vinieron por unos nuevos eliminar solo esos que se repiten pero los antiguos, espero no haberme enredado y que me entiendan.

estuve revisando algo como esto pero nosé como podría hacerlo para que al cumplir las condiciones de que si el dni y nombre_tipoexa se repiten entonces proceda a eliminar dicho registro duplicado antiguo
Código MySQL:
Ver original
  1. DELETE FROM tabla
  2. WHERE id NOT IN (
  3. FROM tabla
  4. );

si alguien podría darme alguna idea, gracias de antemano.

hola aun sin resolver este problemita, intente colocar este codigo
Código MySQL:
Ver original
  1. delete a from tabla AS a,
  2.           (select a1.id AS id from tabla a1
  3.           inner join tabla a2
  4.           on a1.dni = a2.dni
  5.           and a1.id < a2.id) AS t
  6.           where id = t.id

pero se queda pegado :(

Última edición por gnzsoloyo; 09/10/2013 a las 21:17 Razón: Codigo de programacion no permitido en foros de BBDD
  #2 (permalink)  
Antiguo 09/10/2013, 20:25
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: eliminar registros duplicados mas antiguos según 2 campos

Antes de integrar tus consultas en PHP te recomiendo probarlas en PhpMyAdmin para que veas si funcionan o no.

Por lo pronto, muevo tu tema a BDD -> MySQL, donde podrán ayudarte mejor.
__________________
- León, Guanajuato
- GV-Foto
  #3 (permalink)  
Antiguo 09/10/2013, 21:19
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: eliminar registros duplicados mas antiguos según 2 campos

No puedes usar DELETE y SELECT sobre la misma tabla en la misma sentencia. MySQL no te dejará, por seguridad de procesos (en esencia es cortar la rama sobre la que estás parado...).
Deberás hacerlo en dos etapas; primero buscando el rango a borrar y luego borrándolo.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #4 (permalink)  
Antiguo 09/10/2013, 23:58
Avatar de giancarloffi  
Fecha de Ingreso: julio-2013
Mensajes: 63
Antigüedad: 10 años, 9 meses
Puntos: 0
Respuesta: eliminar registros duplicados mas antiguos según 2 campos

entonces tendria que hacer algo asi?
Código MySQL:
Ver original
  1. select idficha, id_tipoexa, count(*)
  2. from examen_otros_laboratorio
  3. group by idficha, id_tipoexa

la sentencia me muestra los duplicados, (lo probé en el navicat) ahora como podria hacer para que me elimine esos duplicados solo dejandome una que sera con el id mas reciente?

Última edición por gnzsoloyo; 10/10/2013 a las 02:00 Razón: Código de programación no permitido en foros de BBDD
  #5 (permalink)  
Antiguo 10/10/2013, 09:22
Avatar de giancarloffi  
Fecha de Ingreso: julio-2013
Mensajes: 63
Antigüedad: 10 años, 9 meses
Puntos: 0
Respuesta: eliminar registros duplicados mas antiguos según 2 campos

por el momento con esto logro lo que quiero
Código MySQL:
Ver original
  1. CREATE TABLE tabla_temporal LIKE examen_otros_laboratorio;
  2. INSERT INTO tabla_temporal SELECT * FROM examen_otros_laboratorio GROUP BY idficha, id_tipoexa;
  3. DROP TABLE examen_otros_laboratorio;
  4. RENAME TABLE tabla_temporal TO examen_otros_laboratorio;

pero necesito que me queden los id mas recientes es urgente :(

Última edición por gnzsoloyo; 10/10/2013 a las 09:34 Razón: Por favor etiquetar con Highlights "SQL" o "MySQL". Para eso está.
  #6 (permalink)  
Antiguo 10/10/2013, 09:38
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: eliminar registros duplicados mas antiguos según 2 campos

Estás cerca:
Código MySQL:
Ver original
  1. CREATE TEMPORARY TABLE tabla_temporal AS
  2. SELECT MAX(idficha) idficha, id_tipoexa
  3. FROM examen_otros_laboratorio
  4. GROUP BY idficha, id_tipoexa;
  5.  
  6. DELETE FROM  examen_otros_laboratorio
  7. WHERE (idficha, id_tipoexa)
  8.             IN(SELECT idficha, id_tipoexa  FROM tabla_temporal);

Con CREATE TEMPORARY ni siquiera debes borrar la tabla temporal, se borra sola, siempre y cuando no cierres la conexión a la base entre la primera y la segunda sentencias.

Nota: Por favor, usa los Highlights correctos, para eso está ese combo que dice "Highlight" en el area de edicion.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 10/10/2013, 10:31
Avatar de giancarloffi  
Fecha de Ingreso: julio-2013
Mensajes: 63
Antigüedad: 10 años, 9 meses
Puntos: 0
Respuesta: eliminar registros duplicados mas antiguos según 2 campos

hola gnzsoloyo gracias por responder, probé tu codigo y se me quedo pegado el navicat tuve que reiniciar la pc y en el phpmyadmin dice que se ejecuto la sentencia peor no creo la tablatemporal, ahora el max(idfecha) lo que se supone que hace es escoger el idficha mayor pero ahi hay varios repetidos que no necesariamente se tiene que eliminar ya que ese idficha esta relacionado a los diferentes tipos de examenes que el paciente puede hacerse entonces ahí lo que le pongo es el max(id) que es el id autoincremental, pero no pasa nada :(
  #8 (permalink)  
Antiguo 10/10/2013, 10:47
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: eliminar registros duplicados mas antiguos según 2 campos

Vamos por parte:
1) ¿El ID de esa tabla es usada como FK en alguna otra?
2) ¿Por qué razon se "duplican" registros. SI es una tabla que registra los diferentes exámenes realizados a una persona, por lo pronto debería tener un campo fecha, y por otro lado no debería eliminarse ningún registro, ya que al hacerlo se pierde trazabilidad histórica.
3) Si lo que quieres es desactivar los registros viejos, lo estándar es agregar un campo de fecha de baja, que sera nulable y que sólo se cargue con un valor al momento de desactivarlo.
4) Si lo que quieres es realmente eliminarlos, lo primero que debes hacer es ubicar el ID de los mas recientes de cada persona, lo que (si es lo que dices) debería ser mas o menos así:
Código MySQL:
Ver original
  1. MAX(id) id
  2. FROM examen_otros_laboratorio
obviamente estoy suponiendo que identificas a una persona por su documento.
5) Como te dije, la clausula TEMPORARY sólo funciona si usas la misma conexión a la base, por lo cual no puedes probar esto en phpMyadmin, porque este crea una conexión para ejecutar cada sentencia, aunque tu no lo veas, por lo que la tabla desaparece luego de ejecutar la sentencia. Lo que te he sugerido sólo funcionará a nivel aplicación.
6) El servidor se te muere porque el GROUP BY es una cláusula asesina de performance, muy poco práctica si los campos no están indexados, o bien si son pocos registros. Pero si usas miles o centenares de miles...

Postea la estructura de las tablas, para poder entender un poco el problema. Si no sabes recuperarla, usa:
Código MySQL:
Ver original
  1. SHOW CREATE TABLE examen_otros_laboratorio
y hazlo por cada una de las tablas relacionadas para lo que deseas hacer. Copia el resultado (ampliándolo si phpMyadmin no te muestra todo el CREATE), y postealo.
Entonces veremos..
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #9 (permalink)  
Antiguo 10/10/2013, 14:00
Avatar de giancarloffi  
Fecha de Ingreso: julio-2013
Mensajes: 63
Antigüedad: 10 años, 9 meses
Puntos: 0
Respuesta: eliminar registros duplicados mas antiguos según 2 campos

hola otra ves y gracias por responderme, bueno lo que pasa es que el sistema esta ya creado por otra persona yo solo estaba implementando el modulo de importar desde el excel algunos datos, y pues en esa tabala hay un id como primary key y otros campos mas entre ellos el idficha y id_tipoexa, dni, etc.

Código MySQL:
Ver original
  1. CREATE TABLE `examen_otros_laboratorio` (
  2.   `id` int(100) NOT NULL auto_increment,
  3.   `idficha` int(100) NOT NULL,
  4.   `id_tipoexa` int(100) NOT NULL,
  5.   `dni` varchar(8) NOT NULL,
  6.   `tipo` varchar(1) NOT NULL,
  7.   `valor` varchar(60) NOT NULL,
  8.   `diagnostico` text NOT NULL,
  9.   `recomendacion` text NOT NULL,
  10.   `activo` varchar(1) NOT NULL,
  11.   `seleccionado` varchar(1) NOT NULL,
  12.   `nombre_tipoexa` varchar(100) NOT NULL,
  13.   PRIMARY KEY  (`id`)
  14. ) ENGINE=MyISAM AUTO_INCREMENT=74393 DEFAULT CHARSET=latin1

en esa taba el idficha com id_tipoexa se pueden repetir pero siemrpe y cuando solo tengan un tipo de examen, entonces si el paciente se va a su segunda consulta en algun tiempo despues pues se tomara otros examenes y se volveran subir por excel y pues se ibana repetir los datos, esta tabla no tiene el campo fecha, pero segun estube viendo y me indicaron que antes de insertar los datos nuevos se genera una nueva ficha y es ahi done se ingresaban los nuevos datos importados por lo que ya no es necesario actualizar ni borrar los datos, y pues simplemente lo tendre que dejar asi pero nose si es lo correcto, pero de todas meneras talves quiciera realizar esta tarea como para no quedarme con la espina :)

Etiquetas: campos, duplicados, php, registro, registros, según, select, tabla
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Tema Cerrado




La zona horaria es GMT -6. Ahora son las 17:58.