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

Update a partir de un Select

Estas en el tema de Update a partir de un Select en el foro de Mysql en Foros del Web. Hola amigos, tengo un select que me devuelve la última imagen de una galería y un campo "inicial" que indica si ésta imagen es la ...
  #1 (permalink)  
Antiguo 01/08/2011, 16:36
Avatar de cesarpunk  
Fecha de Ingreso: enero-2008
Ubicación: Lima
Mensajes: 943
Antigüedad: 16 años, 3 meses
Puntos: 9
Pregunta Update a partir de un Select

Hola amigos, tengo un select que me devuelve la última imagen de una galería y un campo "inicial" que indica si ésta imagen es la principal de la galería:

Código:
SELECT inicial, gi.id_imagen, img.fecha_registro
FROM galeria_imagen gi INNER JOIN imagen img ON gi.id_imagen = img.id_imagen
WHERE id_galeria='1' ORDER BY fecha_registro DESC LIMIT 1
y me devuelve algo como:

INICIAL | ID_IMAGEN | FECHA
--------------------------------------
N | 001 | xxxx-xx-xx

Me gustaría saber si es posible actualizar ese campo "inicial" y cambiar su valor a "S" a partir del query mostrado en una misma sentencia UPDATE, espero me puedan mostrar la manera correcta, saludos!
__________________
Quitenme la vida pero no la bebida.
  #2 (permalink)  
Antiguo 01/08/2011, 17:54
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: Update a partir de un Select

Es medio de manual. La respuesta aparece en cualquier tutorial:
Código MySQL:
Ver original
  1. UPDATE galeria_imagen gi INNER JOIN imagen img ON gi.id_imagen = img.id_imagen
  2. SET inicial = 'S'
  3. WHERE id_galeria='1';

Te conviene acudir a algún tutorial de SQL básico. Fíjate en Maestros del Web (link al pie de esta página). Allí encontrarás manuales y tutoriales muy útiles.
__________________
¿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 01/08/2011, 17:54
Avatar de cesarpunk  
Fecha de Ingreso: enero-2008
Ubicación: Lima
Mensajes: 943
Antigüedad: 16 años, 3 meses
Puntos: 9
Respuesta: Update a partir de un Select

Hola, pues ya lo resolví y lo comparto:

Pues si yo junto el update con un select que apunta directamente a otra tablas me sale el siguiente error:

"You can't specify target table xxx for update in FROM clause"

Pues la solución que encontré es usar alias a las tablas que involucran el select, así:

Código:
UPDATE galeria_imagen SET inicial=1 
WHERE inicial=(
SELECT inicial
FROM (select * from galeria_imagen) as gi INNER JOIN (select * from imagen) as img ON gi.id_imagen = img.id_imagen
WHERE id_galeria='1' ORDER BY fecha_registro DESC LIMIT 1
no sé si será una solución óptima pero al menos es una solución
__________________
Quitenme la vida pero no la bebida.
  #4 (permalink)  
Antiguo 01/08/2011, 17:57
Avatar de cesarpunk  
Fecha de Ingreso: enero-2008
Ubicación: Lima
Mensajes: 943
Antigüedad: 16 años, 3 meses
Puntos: 9
Respuesta: Update a partir de un Select

hola gnzsoloyo , gracias por tu respuesta, pero si te das cuenta uso el ORDER BY fecha_registro DESC LIMIT 1 para obtener el último registro insertado... ya que necesito sólo actualizar ése registro en especial... no todos los que tengan id_galeria='1'

Es posible incluirlo de alguna manera en tu sentencia?

saludos.
__________________
Quitenme la vida pero no la bebida.
  #5 (permalink)  
Antiguo 01/08/2011, 21:31
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: Update a partir de un Select

Pues entonces agrégaselo... ¿no te parece?
Código MySQL:
Ver original
  1. UPDATE galeria_imagen gi INNER JOIN imagen img ON gi.id_imagen = img.id_imagen
  2. SET inicial = 'S'
  3. WHERE id_galeria='1'
  4. ORDER BY fecha_registro DESC
  5. LIMIT 1 ;
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #6 (permalink)  
Antiguo 02/08/2011, 09:07
Avatar de cesarpunk  
Fecha de Ingreso: enero-2008
Ubicación: Lima
Mensajes: 943
Antigüedad: 16 años, 3 meses
Puntos: 9
Respuesta: Update a partir de un Select

Hola gracias por responder, he intentado eso pero me sale el siguiente error:

Error Code : 1221
Incorrect usage of UPDATE and ORDER BY
__________________
Quitenme la vida pero no la bebida.
  #7 (permalink)  
Antiguo 02/08/2011, 09:31
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: Update a partir de un Select

Mmmm... porque me olvidé de aclarar que no se puede usar un ORDER BY y LIMIT en un UPDATE con JOIN.
A mi entender la mejor forma de hacer l oque quieres es obtener primero los dos valores que identifican el registro (id y fecha) en la selección previa. HAcerlo de la forma que propones es ineficiente.
Pero es tu decisió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)
  #8 (permalink)  
Antiguo 02/08/2011, 09:37
Avatar de cesarpunk  
Fecha de Ingreso: enero-2008
Ubicación: Lima
Mensajes: 943
Antigüedad: 16 años, 3 meses
Puntos: 9
Respuesta: Update a partir de un Select

Bueno la verdad no sé si será ineficiente ya que tendría que hacer una consulta previa para actualizar.

Al tema, investigando en el manual encontré otra forma , usando el LIMIT en una subconsulta, pero este a su vez dentro de un alias porque me saldría un error parecido:

This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'

Código:
UPDATE galeria_imagen SET inicial = 1
WHERE id_imagen IN (
SELECT id_imagen FROM (
SELECT gi.id_imagen FROM galeria_imagen gi INNER JOIN imagen as img ON gi.id_imagen = img.id_imagen WHERE id_galeria='1' ORDER BY fecha_registro DESC LIMIT 1
) a
)
De esta manera también se puede actualizar
__________________
Quitenme la vida pero no la bebida.

Última edición por cesarpunk; 02/08/2011 a las 09:55

Etiquetas: join, query, select, update
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 18:53.