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

Cómo comprobar que un campo de una tabla exista en otra tabla?

Estas en el tema de Cómo comprobar que un campo de una tabla exista en otra tabla? en el foro de Mysql en Foros del Web. Hola a todos: Tengo una BD y en una tabla están guardados los usuarios y en la otras sus mensajes. Yo quiero borrar los mensajes ...
  #1 (permalink)  
Antiguo 07/03/2010, 07:43
Avatar de ldp
ldp
 
Fecha de Ingreso: marzo-2005
Ubicación: Por fin, en mi nueva casa!
Mensajes: 617
Antigüedad: 19 años, 1 mes
Puntos: 3
Pregunta Cómo comprobar que un campo de una tabla exista en otra tabla?

Hola a todos:

Tengo una BD y en una tabla están guardados los usuarios y en la otras sus mensajes. Yo quiero borrar los mensajes de los usuarios que ya no existen con una consulta directamente en mysql. Se puede hacer?

La estructura es:

Tabla usuarios: ID_user - Nombre_usuario - Email
Tabla mensajes: ID_msj - Título - Mensaje - ID_user
  #2 (permalink)  
Antiguo 07/03/2010, 07:55
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: Cómo comprobar que un campo de una tabla exista en otra tabla?

Algo así debería funcionar. Sino, la única forma sería con dos consultas:
Código MySQL:
Ver original
  1. DELETE FROM mensajes
  2. WHERE ID_user IN
  3.    (SELECT U.ID_user FROM usuarios U LEFT JOIN mensajes M ON U.ID_user = M.ID_user
  4.     WHERE M.ID_user IS NULL);
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 07/03/2010, 08:00
Avatar de ldp
ldp
 
Fecha de Ingreso: marzo-2005
Ubicación: Por fin, en mi nueva casa!
Mensajes: 617
Antigüedad: 19 años, 1 mes
Puntos: 3
Respuesta: Cómo comprobar que un campo de una tabla exista en otra tabla?

Gracias por responder tan rápido ;) Lo estoy haciendo directamente en phpmyadmin y no me funciona, pero es por cuestión de sintaxis, podrías ponérmelo para usarlo en phpmyadmin?

EDITO: quiero hacer primero un SELECT antes de borrar nada para ver lo que me devuelve, si lo pongo así me devuelve valor vacío:

Código MySQL:
Ver original
  1. SELECT * FROM `mensaje` WHERE `mensaje`.`uid` IN
  2. (SELECT `usuarios`.`uid` FROM `usuarios`
  3. LEFT JOIN `mensajes` ON `usuarios`.`uid` = `mensajes`.`uid` WHERE `mensajes`.`uid` IS NULL)

Última edición por ldp; 07/03/2010 a las 08:11
  #4 (permalink)  
Antiguo 07/03/2010, 09:29
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: Cómo comprobar que un campo de una tabla exista en otra tabla?

SI lo quieres hacer con dos consultas, esto sería más simple, pero requiere que no se cierre la conexión mientras se ejecutan las dos (es preferible hacerlo en un stored procedure):
Código MySQL:
Ver original
  1. SELECT U.ID_user
  2. FROM usuarios U LEFT JOIN mensajes M ON U.ID_user = M.ID_user
  3. WHERE M.ID_user IS NULL;
  4.  
  5. DELETE FROM mensajes
  6. WHERE ID_user IN
  7.    (SELECT U.ID_user FROM msj_temp);

La tabla creada desaparecerá cuando se reinicie la conexión;
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 07/03/2010, 15:26
Avatar de ldp
ldp
 
Fecha de Ingreso: marzo-2005
Ubicación: Por fin, en mi nueva casa!
Mensajes: 617
Antigüedad: 19 años, 1 mes
Puntos: 3
Respuesta: Cómo comprobar que un campo de una tabla exista en otra tabla?

Antes de nada muchísimas gracias por ayudarme ;)

He probado haciendo una tabla fija en vez de temporal para ver si funciona y como me lo has puesto me da de resultado los usuarios que no han escrito ningún mensaje, en vez de los mensajes que no tienen usuario.

Lo he puesto así:

Código MySQL:
Ver original
  1. SELECT M.ID_mensaje
  2. FROM mensajes M LEFT JOIN usuarios U ON M.ID_user = U.ID_user
  3. WHERE U.ID_user IS NULL;
  4.  
  5. DELETE FROM mensajes
  6. WHERE ID_mensaje IN
  7. (SELECT M.ID_mensaje FROM msj_temp);

Sólo he ejecutado la primera parte (el SELECT), esto me da una tabla con los ID de los mensajes "sin dueño". Me gustaría que me dijeras si la segunda parte está bien. En teoría coge los ID de los mensajes sin dueño de la tabla temporal y los que coinciden en la tabla mensajes los borra, está bien?
  #6 (permalink)  
Antiguo 07/03/2010, 15:36
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: Cómo comprobar que un campo de una tabla exista en otra tabla?

Hay una cosa que me intriga: ¿No has definido ninguna FK en el campo ID_user de la tabla mensajes?
Si estás usando tablas MyISAM, se comprende, porque simplemente no se puede (MyISAM no soporta FK), pero si estás usando tablas InnoDB, deberías, porque de esa forma te aseguras que no existan mensajes sin usuarios.

Como sea, si aún no has definido una Fk que otorgue esa restricción, la solución entonces sería:
Código MySQL:
Ver original
  1. SELECT ID_msj
  2. FROM mensajes
  3. WHERE ID_user IS NULL OR ID_user = '';
  4.  
  5. DELETE FROM mensajes
  6. WHERE ID_msj IN
  7.    (SELECT ID_msj FROM msj_temp);

En el primer caso estoy suponiendo que pueden llegar a ingresarse mensajes con ID_user como vacíos y no como NULL.
__________________
¿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 07/03/2010, 16:01
Avatar de ldp
ldp
 
Fecha de Ingreso: marzo-2005
Ubicación: Por fin, en mi nueva casa!
Mensajes: 617
Antigüedad: 19 años, 1 mes
Puntos: 3
Respuesta: Cómo comprobar que un campo de una tabla exista en otra tabla?

El problema es que los mensajes son del foro y he borrado los usuarios inactivos, pero los mensajes quiero que permanezcan. He decidido en vez de borrarlos crear un usuario "admin" y hacer un UPDATE para que los mensajes huérfanos pertenezcan ahora al usuario "admin.


Código MySQL:
Ver original
  1. UPDATE `mensajes`
  2. SET `id_usuario` = 2
  3. WHERE `id_mensaje` IN
  4. (SELECT `id_mensaje` FROM `msj_temp`)

El problema es que la BD me tira:

#1317 - Query execution was interrupted

Estoy investigando a ver cuál es el problema...

EDITO: he probado a hacer sólo con un registro en msj_temp y funciona, el problema es que tengo más de 2000 registros y hacerlo uno por uno es un suicidio. Alguna idea?

Última edición por ldp; 07/03/2010 a las 16:06
  #8 (permalink)  
Antiguo 07/03/2010, 16:28
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: Cómo comprobar que un campo de una tabla exista en otra tabla?

Cita:
he probado a hacer sólo con un registro en msj_temp y funciona, el problema es que tengo más de 2000 registros y hacerlo uno por uno es un suicidio. Alguna idea?
Esta idea:
Código MySQL:
Ver original
  1. UPDATE mensajes
  2. SET ID_user = 2
  3.     ID_user NOT IN (SELECT ID_user FROM usuarios)
  4.     AND (ID_user IS NULL OR ID_user = '' OR ID_user !=2);
Se supone que pondrá 2 en ID_user sin el contenido del campo no está entre los activos, es NULL, es un valor vacío o no es del Admin.
__________________
¿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 07/03/2010, 16:57
Avatar de ldp
ldp
 
Fecha de Ingreso: marzo-2005
Ubicación: Por fin, en mi nueva casa!
Mensajes: 617
Antigüedad: 19 años, 1 mes
Puntos: 3
Respuesta: Cómo comprobar que un campo de una tabla exista en otra tabla?

Muchísimas gracias por toda la ayuda que me has dado. Me ha servido de mucho y he conseguido resolver mi problema.

No te doy más karma porque no puedo :D

Etiquetas: comprobar, tablas, campos
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 21:39.