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

No consigo actualizar una columna a través de 3 tablas

Estas en el tema de No consigo actualizar una columna a través de 3 tablas en el foro de Mysql en Foros del Web. Hola! A ver si alguien puede echarme una mano con esto. Tengo un campo en una tabla el cuál quiero actualizar pero la forma en ...
  #1 (permalink)  
Antiguo 08/08/2013, 11:13
 
Fecha de Ingreso: junio-2012
Mensajes: 46
Antigüedad: 11 años, 9 meses
Puntos: 0
No consigo actualizar una columna a través de 3 tablas

Hola!

A ver si alguien puede echarme una mano con esto.

Tengo un campo en una tabla el cuál quiero actualizar pero la forma en que está diseñada la BBDD no me permite hacerlo a través de una ni dos tablas, sino 3 y me estoy volviendo loco. Tal y como lo tengo ahora:
Código MySQL:
Ver original
  1. update `bfb9s_virtuemart_medias` set `file_title` =
  2. (SELECT `product_name` from `bfb9s_virtuemart_products_es_es` WHERE `virtuemart_product_id` IN
  3. (SELECT `virtuemart_product_id` from `bfb9s_virtuemart_product_medias` where `virtuemart_media_id` IN
  4. (SELECT `virtuemart_media_id` from `bfb9s_virtuemart_medias`)))

Me arroja el error #1093 - You can't specify target table 'bfb9s_virtuemart_medias' for update in FROM clause

Si hago la consulta de los SELECT por separado muestra el resultado que quiero introducir, pero al integrarlo en el UPDATE me lanza ese error.

Buscando información en internet parece que MySQL o la versión que tengo no permite hacerlo de ésa forma sino que debo utilizar INNER JOIN, con dos tablas he hecho algo parecido pero con 3 tablas es algo que se me escapa.

¿Alguien puede arrojarme algo de luz?

Última edición por gnzsoloyo; 08/08/2013 a las 11:16 Razón: Código muy mal etiquetado
  #2 (permalink)  
Antiguo 08/08/2013, 11:45
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: No consigo actualizar una columna a través de 3 tablas

No es sólo que no puedes hacerlo "de esa forma". No puedes hacer un UPDATE sobre la misma tabla que haces un SELECT.

Tan sencillo como eso.

Además, ¿te das cuenta que la única forma de que tal vez podría funcionar, es si esa subconsulta devolviese un únic registro, no?
Código MySQL:
Ver original
  1. UPDATE `bfb9s_virtuemart_medias`
  2.     SET `file_title` = (
  3.                         SELECT `product_name`
  4.                         FROM `bfb9s_virtuemart_products_es_es`
  5.                         WHERE `virtuemart_product_id` IN (
  6.                                         SELECT `virtuemart_product_id`
  7.                                         FROM `bfb9s_virtuemart_product_medias`
  8.                                         WHERE `virtuemart_media_id` IN (SELECT `virtuemart_media_id`
  9.                                                                         FROM `bfb9s_virtuemart_medias`)))
Lo que quieres hacer conviene hacerlo con consultas previas, sea por programación o bien en un stored procedure.
__________________
¿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 08/08/2013, 14:36
 
Fecha de Ingreso: junio-2012
Mensajes: 46
Antigüedad: 11 años, 9 meses
Puntos: 0
Respuesta: No consigo actualizar una columna a través de 3 tablas

Por si a alguien le ayuda en un futuro dejo los pasos que he seguido (seguro que hay 100 formas mejores de hacerlo pero dá el resultado que necesitaba):


Código:
CREATE TABLE `bfb9s_virtuemart_temporal` AS
(SELECT `virtuemart_media_id`, `virtuemart_product_id` from `bfb9s_virtuemart_product_medias`)

Código:
ALTER TABLE `bfb9s_virtuemart_temporal` ADD COLUMN `product_name` CHAR (180) NOT NULL;
Código:
UPDATE `bfb9s_virtuemart_temporal` 
INNER JOIN `bfb9s_virtuemart_products_es_es`
ON `bfb9s_virtuemart_temporal`.virtuemart_product_id = `bfb9s_virtuemart_products_es_es`.virtuemart_product_id
SET `bfb9s_virtuemart_temporal`.product_name = `bfb9s_virtuemart_products_es_es`.product_name
Código:
UPDATE `bfb9s_virtuemart_medias` 
INNER JOIN `bfb9s_virtuemart_temporal`
ON `bfb9s_virtuemart_medias`.virtuemart_media_id = `bfb9s_virtuemart_temporal`.virtuemart_media_id
SET `bfb9s_virtuemart_medias`.file_title = `bfb9s_virtuemart_temporal`.product_name
  #4 (permalink)  
Antiguo 08/08/2013, 14:40
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: No consigo actualizar una columna a través de 3 tablas

Hubiese sido mucho más simple usar una tabla de tipo TEMPORARY.
Con sólo dos sentencias habrías tenido la solución, pero bueno, es el método que elegiste.
__________________
¿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 08/08/2013, 15:07
 
Fecha de Ingreso: junio-2012
Mensajes: 46
Antigüedad: 11 años, 9 meses
Puntos: 0
Respuesta: No consigo actualizar una columna a través de 3 tablas

Seguro que hay muchas formas de hacerlo mejor, no me cabe la menor duda, pero no soy muy ducho con BBDD. Cuando solicité ayuda en el primer comentario me hubiera gustado una ayuda un poco más explícita (no dudo de tus buenas intenciones cuando me respondiste, pero para alguien inexperto como yo me dejaste igual que cuando pregunté).

Conseguí mi propósito y por el momento vale así, ya tendremos tiempo más adelante de pulirlo si me merece la pena.

Saludos.

Etiquetas: campo, columna, join, select, sql, 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 19:23.