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

Eliminar registros duplicados y que exporte todos no solo el repetido

Estas en el tema de Eliminar registros duplicados y que exporte todos no solo el repetido en el foro de Bases de Datos General en Foros del Web. Hola. Mi problema es que tengo una tabla llamada "ibf_members" con mas de 90.000 registros. De esos 90.000 mas de 20.000 son validos, el resto ...
  #1 (permalink)  
Antiguo 25/05/2005, 15:48
Avatar de swishts  
Fecha de Ingreso: noviembre-2002
Ubicación: Uruguay
Mensajes: 209
Antigüedad: 22 años
Puntos: 0
Eliminar registros duplicados y que exporte todos no solo el repetido

Hola.
Mi problema es que tengo una tabla llamada "ibf_members" con mas de 90.000 registros.
De esos 90.000 mas de 20.000 son validos, el resto copias.
Ya se como se hace para que busque en el campo "name" los que tengan el mismo name y me deje lo que tiene que quedar pero el problema mio es a la hora de exportar.
Me exporta solo el campo name, pero el password, avatar y todos los otros no me los exporta, si importada lo exportado de esa forma nadie tendria una clave para poder acceder.

Porfavor si alguien sabe, despues de un DISTINCT como se hace para que no solo exporte lo encontrado, le agradesco la ayuda.

Saludos.
__________________
--------------------------
QUINCHOS WILFREDO, http://www.quinchoswilfredo.com
  #2 (permalink)  
Antiguo 25/05/2005, 17:27
Avatar de Neuron_376  
Fecha de Ingreso: abril-2005
Mensajes: 1.051
Antigüedad: 19 años, 7 meses
Puntos: 2
Humm..

Por que no primero borras de la base de datos todos los repetidos y luego corres el export ?

Tienes acceso a tu administrador de bases de datos directamente?, deberias de contar con esa clase de herramientas, y crearte un script que haga todo eso, algo como:

//Creas una tabla igual a la ofiginal

create tempTable
(
campo1 tipo1,
campo2 tipo2,
)

inset into tempTable (campo1, campo2) select distint campo1, campo2 from tablaOrigianal

Bueno, hasta ese punto ya tienes una base de datos limpia que puedes exportar o tratar como lo necesites.

Suerte!!
__________________
NeuronaNet.com... la idea correcta.
http://www.NeuronaNet.com
  #3 (permalink)  
Antiguo 26/05/2005, 12:57
Avatar de sir_joshua  
Fecha de Ingreso: diciembre-2004
Mensajes: 411
Antigüedad: 19 años, 11 meses
Puntos: 0
En que base estas trabajando ..?

en oracle existe la posibilidad de hacer un export mediante un query, eso resolveria tu problema, si es ke usas oracle...

o crea la nueva estructura en tu nuevo destino y posteriormente genera un script ke inserte los 20.000 regs distintos que necesitas..ej:

select distinct 'insert into ibf_members values("'||name||'","'||pass||'","'||avatar||'","' ||etc||'");'
from ibf_members;

salu2.
__________________
http://sir-joshua.hi5.com
Mex. Mex.
  #4 (permalink)  
Antiguo 26/05/2005, 13:26
Avatar de swishts  
Fecha de Ingreso: noviembre-2002
Ubicación: Uruguay
Mensajes: 209
Antigüedad: 22 años
Puntos: 0
Es una base de datos MySQL , en resumen una base de datos del IPB, Invision Power Board.

Me gusto mas la primer respuesta pero me faltaria solo una cosa, necesito que borre los que tienen el "id" mas bajo.

Saludos.
__________________
--------------------------
QUINCHOS WILFREDO, http://www.quinchoswilfredo.com
  #5 (permalink)  
Antiguo 26/05/2005, 13:33
Avatar de Neuron_376  
Fecha de Ingreso: abril-2005
Mensajes: 1.051
Antigüedad: 19 años, 7 meses
Puntos: 2
Humm...

Bueno, habias dicho que los demas son copias, es decir, exactamente iguales, entonces no hay ningun problema con el ID, de hecho con el metodo que te puse lo que puede pasar segun la configuracion de tu tabla temporal, es que el ID sea nuevo, es decir, empieze de 1,2,3,4,5,6, o bien que acepte guardar el ID actual como tu deseas, pero tendrias ID salteados como, 1, 5, 8, 20, etc.

Suerte!!
__________________
NeuronaNet.com... la idea correcta.
http://www.NeuronaNet.com
  #6 (permalink)  
Antiguo 26/05/2005, 13:42
Avatar de swishts  
Fecha de Ingreso: noviembre-2002
Ubicación: Uruguay
Mensajes: 209
Antigüedad: 22 años
Puntos: 0
No, te pongo un ejemplo.

id: 01
name: pepe
pass: pepe

-------------

id: 02
name: pepe
pass: pepe

Necesito que me quede solo el pepe con el id: 02

Lo primero que hice fue:

SELECT DISTINCT `name` FROM `members` ORDER BY `id` DESC

Eso lo exporto y creo otra tabla

Despues tengo que hacer esto?

insert into tempTable (name) select distint name from tablaOriginal

Gracias por la ayuda.
__________________
--------------------------
QUINCHOS WILFREDO, http://www.quinchoswilfredo.com
  #7 (permalink)  
Antiguo 26/05/2005, 14:32
Avatar de swishts  
Fecha de Ingreso: noviembre-2002
Ubicación: Uruguay
Mensajes: 209
Antigüedad: 22 años
Puntos: 0
Con esta linea:

INSERT INTO tabla_temp (id, name) select name, min(id) from tabla_original group by 1

Me deja tal como quiero que este pero no el resto de los campos como el pass el numero de post y los demas, por lo que uso esta otra linea:

INSERT INTO tabla_temp (id, name, mgroup, legacy_password, email, joined, ip_address, posts, title, allow_admin_mails, time_offset, hide_email, email_pm, email_full, skin, warn_level, warn_lastwarn, language, last_post, restrict_post, view_sigs, view_img, view_avs, view_pop, bday_day, bday_month, bday_year, new_msg, msg_total, show_popup, misc, last_visit, last_activity, dst_in_use, view_prefs, coppa_user, mod_posts, auto_track, org_perm_id, temp_ban, sub_end, login_anonymous, ignored_users, mgroup_others, member_login_key, has_blog, subs_pkg_chosen) select name, min(id) from tabla_original group by 1

Con esta line me dice esto:

#1136 - Column count doesn't match value count at row 1

Que esta mal?

Las columas son 47 en total las he contado en la tabla original, temportal y en la linea
Ustedes entienden?
__________________
--------------------------
QUINCHOS WILFREDO, http://www.quinchoswilfredo.com
  #8 (permalink)  
Antiguo 26/05/2005, 14:37
Avatar de Myakire
Colaborador
 
Fecha de Ingreso: enero-2002
Ubicación: Centro de la república
Mensajes: 8.849
Antigüedad: 22 años, 10 meses
Puntos: 146
Haz el SELECT con un INTO y ahorrate el INSERT, funciona incluso en MYSQL

SELECT DISTINCT campo(s) INTO tempTable FROM Tabla ORDER BY id DESC
  #9 (permalink)  
Antiguo 26/05/2005, 15:14
Avatar de Neuron_376  
Fecha de Ingreso: abril-2005
Mensajes: 1.051
Antigüedad: 19 años, 7 meses
Puntos: 2
Hola!

Una pregunta, porque quieres el ultimo ID, si los campos son exactamente lo mismo, no creo sincerametne que lo necesites, ademas en la nueva tabla seria mejor tener los ID correctos como 1,2,3,4,5,6, y no desordenados como 1,4,7,10.

Bueno, en mi opinion seria lo mejor, depues de tener la tabla temporal que tiene los archivos correctos puedes borrar la tabla original, y luego renombrar la tabla temporal como la original, asi te queda una tabla limpia y ademas bien ordenada.

A la larga te quedara mas ligera, es decir optomizada, y esto hara mucho mejor todos tus procesos en tu pagina.

Digo, digo...
__________________
NeuronaNet.com... la idea correcta.
http://www.NeuronaNet.com
  #10 (permalink)  
Antiguo 26/05/2005, 15:22
Avatar de swishts  
Fecha de Ingreso: noviembre-2002
Ubicación: Uruguay
Mensajes: 209
Antigüedad: 22 años
Puntos: 0
Cita:
Iniciado por Neuron_376
Una pregunta, porque quieres el ultimo ID, si los campos son exactamente lo mismo, no creo sincerametne que lo necesites, ademas en la nueva tabla seria mejor tener los ID correctos como 1,2,3,4,5,6, y no desordenados como 1,4,7,10.

Bueno, en mi opinion seria lo mejor, depues de tener la tabla temporal que tiene los archivos correctos puedes borrar la tabla original, y luego renombrar la tabla temporal como la original, asi te queda una tabla limpia y ademas bien ordenada.

A la larga te quedara mas ligera, es decir optomizada, y esto hara mucho mejor todos tus procesos en tu pagina.

Digo, digo...
Te explico, el ID es lo que menos importa, debe de ser el id mas alto porque por problemas para acceder al foro se registraron con otras claves o simplemente se olvidaron.
Y la que utilizan siempre o se acuerdan cual es es el ultimo registro de todos, o sea el id mas alto, por eso quiero borrar los viejos registros y dejar los nuevos.
Respecto a lo de crear una temporal, ponerle lo que quiero y eliminar de la original todo menos lo que esta en esa temporal no puedo hacerlo porque mi version de mysql no me lo permite.

Si miran en mis mensajes escritos veran que hice la misma pregunta hace mucho tiempo y me dieron esa solucion pero sigo sin poder...
Por eso busco otra manera que no sea esa ya que no puedo.

Saludos.
__________________
--------------------------
QUINCHOS WILFREDO, http://www.quinchoswilfredo.com
  #11 (permalink)  
Antiguo 26/05/2005, 15:52
Avatar de Neuron_376  
Fecha de Ingreso: abril-2005
Mensajes: 1.051
Antigüedad: 19 años, 7 meses
Puntos: 2
Hola!

Entiendo, entonces los campos no son iguales, no son copias exactas, bueno, pensando en eso, debes crear una serie de instruccies de todas formas, y la parte de crear temporal, borrar original, etc, lo puedes hacer desde un script normal, no necesitas tener acceso a un ambiente visual.

Necesitaras probar varias combinaciones para eso...

Lo malo es que creo que MySql no soporta cursores, eso seria lo mas recomendable en tu caso,

Primero busca que select te regresa exactamente lo que necesitas.

Necesitas probar por partes:

1. Regeresar el Max(ID) para un usuario
select Max(ID) from Tabla where name = 'pepe'

2. Basado en ese MaxID, traes toda su info:
select * from Tabla where ID = (select Max(ID) from Tabla where name = 'pepe')

Pero bueno, ocupandose para todo, creo que tendras que apoyarte en un script de PHP, que haga lo siguiente:

select distinct name, pass, id from tabla.

Eso lo tienes en un arreglo, entonces haces una consulta para cada nombre como la consulta 1.

Ya tienes los ID maximos en un arreglo, entonces corres consultas para cada ID, entonces ya tienes toda la info correcta en un arreglo.

Ahora corres inserts para cada registro en tu arreglo.

Creo que eso es lo que necesitas, porque se trata de algo mas avanzado y complicado por el detalle que mencionas.

Suerte!!
__________________
NeuronaNet.com... la idea correcta.
http://www.NeuronaNet.com
  #12 (permalink)  
Antiguo 27/05/2005, 11:30
Avatar de swishts  
Fecha de Ingreso: noviembre-2002
Ubicación: Uruguay
Mensajes: 209
Antigüedad: 22 años
Puntos: 0
No, solo cambian el id, o sea, solo me interesa que no queden los mismos nombres el resto para fuera.

Lo que me explicaste es chino del puro para mi, dime cuanto me cobrarias por hacerme ese php o alguien que este interesado que me diga tambien.
__________________
--------------------------
QUINCHOS WILFREDO, http://www.quinchoswilfredo.com
  #13 (permalink)  
Antiguo 27/05/2005, 11:55
Avatar de Neuron_376  
Fecha de Ingreso: abril-2005
Mensajes: 1.051
Antigüedad: 19 años, 7 meses
Puntos: 2
Hola!

Primero tienes que definir tu problema, es que al principio entendi justo lo que me acabas de decir en este ultimo mensaje, que tienes cosas como:

id = 1
name = pepe
pass = pepeclave

id = 2
name = pepe
pass = pepeclave

id = 3
name = pepe
pass = pepeclave

Y luego por lo que explicaste de las claves dices que tienes cosas como:

id = 1
name = pepe
pass = pepeclave

id = 2
name = pepe
pass = pepeclave2

id = 3
name = pepe
pass = pepeclave3

Y que por eso necesitas el ID mas alto, porque la clave del ultimo ID es la correcta, entonces, por favor explica bien el estado actual de tu tabla, porque si esta como la primera opcion, entonces lo que te escribi al principio es lo que necesitas, pero si esta como la segunda opcion entonces es lo ultimo que te escribi.... para cosas de alguien que te haga el trabajo puedes consultar la liga de mi firma, ahi te podran ayudar.

Pero si puedes resolverlo pues adelante
__________________
NeuronaNet.com... la idea correcta.
http://www.NeuronaNet.com
  #14 (permalink)  
Antiguo 27/05/2005, 12:01
Avatar de Neuron_376  
Fecha de Ingreso: abril-2005
Mensajes: 1.051
Antigüedad: 19 años, 7 meses
Puntos: 2
Tambien...

Tu consulta:

INSERT INTO tabla_temp (id, name, mgroup, legacy_password, email, joined, ip_address, posts, title, allow_admin_mails, time_offset, hide_email, email_pm, email_full, skin, warn_level, warn_lastwarn, language, last_post, restrict_post, view_sigs, view_img, view_avs, view_pop, bday_day, bday_month, bday_year, new_msg, msg_total, show_popup, misc, last_visit, last_activity, dst_in_use, view_prefs, coppa_user, mod_posts, auto_track, org_perm_id, temp_ban, sub_end, login_anonymous, ignored_users, mgroup_others, member_login_key, has_blog, subs_pkg_chosen) select name, min(id) from tabla_original group by 1

Dices que con esa consulta se resuelve tu problema verdad, bueno, lo que esta mal, es la parte del select...


INSERT INTO tabla_temp (id, name, mgroup, legacy_password, email, joined, ip_address, posts, title, allow_admin_mails, time_offset, hide_email, email_pm, email_full, skin, warn_level, warn_lastwarn, language, last_post, restrict_post, view_sigs, view_img, view_avs, view_pop, bday_day, bday_month, bday_year, new_msg, msg_total, show_popup, misc, last_visit, last_activity, dst_in_use, view_prefs, coppa_user, mod_posts, auto_track, org_perm_id, temp_ban, sub_end, login_anonymous, ignored_users, mgroup_others, member_login_key, has_blog, subs_pkg_chosen) select name, min(id), [TODOS LOS CAMPOS QUE ESTAS TRATANDO DE INSERTAR] from tabla_original group by 1

Suerte!!
__________________
NeuronaNet.com... la idea correcta.
http://www.NeuronaNet.com
  #15 (permalink)  
Antiguo 27/05/2005, 12:01
Avatar de swishts  
Fecha de Ingreso: noviembre-2002
Ubicación: Uruguay
Mensajes: 209
Antigüedad: 22 años
Puntos: 0
Es como el primer ejemplo, pero creo que no viene al caso los pass que puedan tener.
Lo importantes es seleccionar todos los nombres repetidos y de esos nombre repetidos DEseleccionar (quitar) los que tiene el ID mas alto.
__________________
--------------------------
QUINCHOS WILFREDO, http://www.quinchoswilfredo.com

Última edición por swishts; 27/05/2005 a las 12:06
  #16 (permalink)  
Antiguo 27/05/2005, 12:06
Avatar de Neuron_376  
Fecha de Ingreso: abril-2005
Mensajes: 1.051
Antigüedad: 19 años, 7 meses
Puntos: 2
Hola!

Si influye que los pass sean diferentes, porque es un detalle que hace mas complejo el vaciado, pero mira, prueba el cambio a la consulta que te puse arriba y luego nos dices si funciona o no, para mi entender si la primera ya te funcionaba, entonces esa debe de funcionarte, si eso no lo resulve seguimos con mas opciones...

Suerte!!
__________________
NeuronaNet.com... la idea correcta.
http://www.NeuronaNet.com
  #17 (permalink)  
Antiguo 27/05/2005, 12:10
Avatar de swishts  
Fecha de Ingreso: noviembre-2002
Ubicación: Uruguay
Mensajes: 209
Antigüedad: 22 años
Puntos: 0
Cita:
Iniciado por Neuron_376
Tu consulta:

INSERT INTO tabla_temp (id, name, mgroup, legacy_password, email, joined, ip_address, posts, title, allow_admin_mails, time_offset, hide_email, email_pm, email_full, skin, warn_level, warn_lastwarn, language, last_post, restrict_post, view_sigs, view_img, view_avs, view_pop, bday_day, bday_month, bday_year, new_msg, msg_total, show_popup, misc, last_visit, last_activity, dst_in_use, view_prefs, coppa_user, mod_posts, auto_track, org_perm_id, temp_ban, sub_end, login_anonymous, ignored_users, mgroup_others, member_login_key, has_blog, subs_pkg_chosen) select name, min(id) from tabla_original group by 1

Dices que con esa consulta se resuelve tu problema verdad, bueno, lo que esta mal, es la parte del select...


INSERT INTO tabla_temp (id, name, mgroup, legacy_password, email, joined, ip_address, posts, title, allow_admin_mails, time_offset, hide_email, email_pm, email_full, skin, warn_level, warn_lastwarn, language, last_post, restrict_post, view_sigs, view_img, view_avs, view_pop, bday_day, bday_month, bday_year, new_msg, msg_total, show_popup, misc, last_visit, last_activity, dst_in_use, view_prefs, coppa_user, mod_posts, auto_track, org_perm_id, temp_ban, sub_end, login_anonymous, ignored_users, mgroup_others, member_login_key, has_blog, subs_pkg_chosen) select name, min(id), [TODOS LOS CAMPOS QUE ESTAS TRATANDO DE INSERTAR] from tabla_original group by 1

Suerte!!
Entonces seria asi:

INSERT INTO tabla_temp (id, name, mgroup, legacy_password, email, joined, ip_address, posts, title, allow_admin_mails, time_offset, hide_email, email_pm, email_full, skin, warn_level, warn_lastwarn, language, last_post, restrict_post, view_sigs, view_img, view_avs, view_pop, bday_day, bday_month, bday_year, new_msg, msg_total, show_popup, misc, last_visit, last_activity, dst_in_use, view_prefs, coppa_user, mod_posts, auto_track, org_perm_id, temp_ban, sub_end, login_anonymous, ignored_users, mgroup_others, member_login_key, has_blog, subs_pkg_chosen) select name, min(id), [id, name, mgroup, legacy_password, email, joined, ip_address, posts, title, allow_admin_mails, time_offset, hide_email, email_pm, email_full, skin, warn_level, warn_lastwarn, language, last_post, restrict_post, view_sigs, view_img, view_avs, view_pop, bday_day, bday_month, bday_year, new_msg, msg_total, show_popup, misc, last_visit, last_activity, dst_in_use, view_prefs, coppa_user, mod_posts, auto_track, org_perm_id, temp_ban, sub_end, login_anonymous, ignored_users, mgroup_others, member_login_key, has_blog, subs_pkg_chosen] from tabla_original group by 1
__________________
--------------------------
QUINCHOS WILFREDO, http://www.quinchoswilfredo.com
  #18 (permalink)  
Antiguo 27/05/2005, 12:15
Avatar de Neuron_376  
Fecha de Ingreso: abril-2005
Mensajes: 1.051
Antigüedad: 19 años, 7 meses
Puntos: 2
Pruebalo

Asi como dices deberia de ser, ademas el orden de los campos, es decir, checa que el orden que tienes en el insert es el mismo que aparece en el select, y ademas, los [ ] los puse como referencia, realmente no los necesitas.

Si te da errores de tipo de datos es por el orden que los tienes.

Esperemos que funcione.
__________________
NeuronaNet.com... la idea correcta.
http://www.NeuronaNet.com
  #19 (permalink)  
Antiguo 27/05/2005, 15:32
Avatar de swishts  
Fecha de Ingreso: noviembre-2002
Ubicación: Uruguay
Mensajes: 209
Antigüedad: 22 años
Puntos: 0
Wow, no se como agradecertelo, de verdad man, TE QUIERO !!!!
Toda la ayuda que me has dado a cambio de nada.
Pase de 90.000 a 20.000 sin ningun repetido y tal cual estaban con sus pass y todo.
Realmente muchas gracias, en mi post anterior con 30 respuestas no me dieron una solucion como la que tu me has dado.
Bueno, Gracias por todo y pueden dar este post por cerrado.

Saludos.
__________________
--------------------------
QUINCHOS WILFREDO, http://www.quinchoswilfredo.com
  #20 (permalink)  
Antiguo 27/05/2005, 15:34
Avatar de Neuron_376  
Fecha de Ingreso: abril-2005
Mensajes: 1.051
Antigüedad: 19 años, 7 meses
Puntos: 2
Jajajaja

Felicidades, y no lo digas en publico, "TE QUIERO", escribelo en un MP por lo menos, que me andas quemando ...

Jajaja , bueno, que bueno que resolviste el problema.

Suerte!!
__________________
NeuronaNet.com... la idea correcta.
http://www.NeuronaNet.com
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.
Respuesta




La zona horaria es GMT -6. Ahora son las 23:14.