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

Consulta en dos tablas ??

Estas en el tema de Consulta en dos tablas ?? en el foro de Mysql en Foros del Web. Tengo que actualizar dos tablas el problema es que no se como hacer para hacer todo en una sola consulta. En dos consultas funciona como ...
  #1 (permalink)  
Antiguo 24/01/2013, 09:37
Avatar de asdmaster  
Fecha de Ingreso: marzo-2010
Mensajes: 98
Antigüedad: 14 años, 1 mes
Puntos: 2
Consulta en dos tablas ??

Tengo que actualizar dos tablas el problema es que no se como hacer para hacer todo en una sola consulta.

En dos consultas funciona como deberia.
Código MySQL:
Ver original
  1. UPDATE pm_subjects SET status_read=1 WHERE (id_pm_subject=? AND id_user_receiver=?)
  2.  
  3. UPDATE responses SET status_read=1 WHERE (fk_id_pm_subject=? AND id_user_receiver=?)

Pero al tratar de unirlas no funciona, se que es error de planteamiento pero como debo formular la consulta ???
Código MySQL:
Ver original
  1. UPDATE pm_subjects, pm_responses
  2.     SET pm_subjects.status_read=1, pm_responses.status_read=1
  3. WHERE (pm_subjects.id_pm_subject=? AND pm_subjects.id_user_receiver=?)
  4.     OR (pm_responses.fk_id_pm_subject=? AND pm_responses.id_user_receiver=?)'

Última edición por gnzsoloyo; 24/01/2013 a las 10:53 Razón: Codigo de programacion embebdio, no permitodo en foros de BBDD
  #2 (permalink)  
Antiguo 24/01/2013, 10:57
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, 5 meses
Puntos: 2658
Respuesta: Consulta en dos tablas ??

Se trata en esencia de un JOIN, por lo que debes poner sobre qué campos se relacionan las dos tablas, y sólo modificará aquellos donde haya registros coincidentes entre ambas.
Algo ocmo (suponiendo):
Código MySQL:
Ver original
  1. UPDATE pm_subjects, pm_responses
  2. SET pm_subjects.status_read=1, pm_responses.status_read=1
  3. WHERE pm_subjects.id_pm_subject=pm_responses.fk_id_pm_subject AND pm_subjects.id_user_receiver=pm_responses.id_user_receiver=?

Lo que debes tener en cuenta es que el JOIN debe ser mandatorio, y esto significa que sí o si debe haber relación, o el update dará cualquier resultado erróneo.
Si no existe una coincidencia total, no puedes hacer el UPDATE en JOIN.

PD: Para postear en los foros de BBDD debes expurgar todo lo que no sea SQL de tus códigos.
__________________
¿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 24/01/2013, 11:14
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Consulta en dos tablas ??

Código:
EDITO: jejejeje me entretuve tanto en el mensaje que el compañero gnzsoloyo se me adelantó... Saludos!!!
Hola asdmaster:



Antes que nada, no es correcto que mezcles código de programación con código SQL... está prohibido por políticas del foro y corres el riesgo de que los administradores lo modifiquen y no se entienda el problema... cuando publiques en este foro enfócate sólo en el SQL... si tienes un problema con PHP o con cualquier otro lenguaje de programación, entonces publica tu pregunta en los foros respectivos.

Ahora si, vayamos al tema de tu problema... no nos dices en realidad cómo es la actualización que quieres realizar, ni tampoco nos dices cuál es la relación que hay entre tus tablas... Tampoco nos dices si la consulta que estás colocando te marca un error (y si fuera el caso no nos dices qué error es el que te marca). Si la consulta no marca error, pero no obtienes los resultados esperados, entonces también deberías comentar más al respecto. Mucho ojo para la siguiente... recuerda que no somos adivinos, entre más detalles puedas dar del problema, más fácil será que podamos dar con una solución...

Ahora bien... tratando de jugar al adivino, creo que el problema está en las relaciones entre tus tablas... te pongo un ejemplo para ver si este es el problema. Supongamos que tenemos estas tablas:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla1;
  2. +------+-------+
  3. | id   | campo |
  4. +------+-------+
  5. |    1 | uno   |
  6. |    2 | dos   |
  7. |    3 | tres  |
  8. +------+-------+
  9. 3 rows in set (0.00 sec)
  10.  
  11. mysql> SELECT * FROM tabla2;
  12. +------+-------+
  13. | id   | campo |
  14. +------+-------+
  15. |    1 | one   |
  16. |    2 | two   |
  17. |    4 | four  |
  18. +------+-------+
  19. 3 rows in set (0.00 sec)

Observa que en ambas tablas aparece el id=1... supongamos que entonces tú quieres modificar este campo en ambas tablas... para hacerlo deberás hacer algo como esto:

Código MySQL:
Ver original
  1. mysql> UPDATE tabla1, tabla2 SET
  2.     -> tabla1.campo = CONCAT(tabla1.campo, ' modificado'),
  3.     -> tabla2.campo = CONCAT(tabla2.campo, ' modificado')
  4.     -> WHERE
  5.     ->   tabla1.id = tabla2.id AND
  6.     ->   tabla1.id = 1;
  7. Query OK, 2 rows affected (0.05 sec)
  8. Rows matched: 2  Changed: 2  Warnings: 0
  9.  
  10. mysql> SELECT * FROM tabla1;
  11. +------+----------------+
  12. | id   | campo          |
  13. +------+----------------+
  14. |    1 | uno modificado |
  15. |    2 | dos            |
  16. |    3 | tres           |
  17. +------+----------------+
  18. 3 rows in set (0.00 sec)
  19.  
  20. mysql> SELECT * FROM tabla2;
  21. +------+----------------+
  22. | id   | campo          |
  23. +------+----------------+
  24. |    1 | one modificado |
  25. |    2 | two            |
  26. |    4 | four           |
  27. +------+----------------+
  28. 3 rows in set (0.00 sec)

Hasta aquí todo está bien... entonces, dónde puede estar el problema? hay que tener mucho cuidado con las condiciones que estás poniendo... observa que yo pongo dos... una para especificar las relaciones entre las tablas (tabla1.id = tabla2.id) y la otra para filtrar el id que quiero modificar (tabla1.id = 1).

Un error típico que suele ocurrir cuando tratas de modificar más de una tabla en un UPDATE es justamente no poner las condiciones que relacionan las tablas... observa este ejemplo... voy a modificar el id=2 de la manera en que lo estás haciendo:

Código MySQL:
Ver original
  1. mysql> UPDATE tabla1, tabla2 SET
  2.     -> tabla1.campo = CONCAT(tabla1.campo, ' modificado'),
  3.     -> tabla2.campo = CONCAT(tabla2.campo, ' modificado')
  4.     -> WHERE tabla1.id = 2 OR tabla2.id = 2;
  5. Query OK, 6 rows affected (0.11 sec)
  6. Rows matched: 6  Changed: 6  Warnings: 0
  7.  
  8. mysql> SELECT * FROM tabla1;
  9. +------+---------------------------+
  10. | id   | campo                     |
  11. +------+---------------------------+
  12. |    1 | uno modificado modificado |
  13. |    2 | dos modificado            |
  14. |    3 | tres modificado           |
  15. +------+---------------------------+
  16. 3 rows in set (0.00 sec)
  17.  
  18. mysql> SELECT * FROM tabla2;
  19. +------+---------------------------+
  20. | id   | campo                     |
  21. +------+---------------------------+
  22. |    1 | one modificado modificado |
  23. |    2 | two modificado            |
  24. |    4 | four modificado           |
  25. +------+---------------------------+
  26. 3 rows in set (0.00 sec)

¿Qué fue lo que pasó, si sólo especificaste que el id fuera dos... entonces por qué diablos modificó todos los registros?

La respuesta está en el concepto de PRODUCTO CARTESIANO, que supongo debes saber de que se trata... observa estos SELECT's:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla1, tabla2
  2.     -> WHERE
  3.     ->   tabla1.id = tabla2.id AND
  4.     ->   tabla1.id = 2;
  5. +------+----------------+------+----------------+
  6. | id   | campo          | id   | campo          |
  7. +------+----------------+------+----------------+
  8. |    2 | dos modificado |    2 | two modificado |
  9. +------+----------------+------+----------------+
  10. 1 row in set (0.00 sec)
  11.  
  12. mysql> SELECT * FROM tabla1, tabla2
  13.     -> WHERE
  14.     ->   tabla1.id = 2 OR tabla2.id = 2;
  15. +------+---------------------------+------+---------------------------+
  16. | id   | campo                     | id   | campo                     |
  17. +------+---------------------------+------+---------------------------+
  18. |    2 | dos modificado            |    1 | one modificado modificado |
  19. |    1 | uno modificado modificado |    2 | two modificado            |
  20. |    2 | dos modificado            |    2 | two modificado            |
  21. |    3 | tres modificado           |    2 | two modificado            |
  22. |    2 | dos modificado            |    4 | four modificado           |
  23. +------+---------------------------+------+---------------------------+
  24. 5 rows in set (0.00 sec)

Observa en el segundo caso, se está realizando un PRODUCTO CARTESIANO entre las tablas... es por eso que se modifican todos los registros...

Espero que esto te ayude a resolver tu problema, pero si continuas con algún detalle lo comentas en el foro.

Saludos
Leo.
  #4 (permalink)  
Antiguo 24/01/2013, 12:03
Avatar de asdmaster  
Fecha de Ingreso: marzo-2010
Mensajes: 98
Antigüedad: 14 años, 1 mes
Puntos: 2
Respuesta: Consulta en dos tablas ??

Gracias por sus respuestas me han sido de mucha ayuda sobre todo por ser muy completas, también se agradece el educar sobre la manera correcta de crear temas en este foro, me parece excelente.
Nuevamente gracias por su tiempo y ayuda.
Saludos!

Etiquetas: tabla, tablas
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 14:54.