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

UPDATE con SELECT anidado

Estas en el tema de UPDATE con SELECT anidado en el foro de Mysql en Foros del Web. Bueno, tengo el siguiente problema.. necesito hacer un update a la ultima fila de una tabla.. Yo se que para que te traiga la ultima ...
  #1 (permalink)  
Antiguo 20/07/2009, 15:33
 
Fecha de Ingreso: febrero-2007
Mensajes: 141
Antigüedad: 17 años, 2 meses
Puntos: 1
Pregunta UPDATE con SELECT anidado

Bueno, tengo el siguiente problema.. necesito hacer un update a la ultima fila de una tabla..
Yo se que para que te traiga la ultima fila se hace la siguiente consulta:

SELECT cajatotal ORDER BY factura LIMIT 1;

Y para el UPDATE intente lo siguiente pero no me salio:

UPDATE negocio.ventas SET cajatotal="2" WHERE (SELECT cajatotal ORDER BY factura LIMIT 1);

Lo que hace, es modificarme TODAS las filas y NO la ultima.. alguna idea?

Gracias por la ayuda.
  #2 (permalink)  
Antiguo 20/07/2009, 17:05
Avatar de cala932  
Fecha de Ingreso: septiembre-2006
Ubicación: San Juan-Argentina
Mensajes: 902
Antigüedad: 17 años, 7 meses
Puntos: 9
Respuesta: UPDATE con SELECT anidado

Holas lo que sucede es que en el where no estas especificando que registro debe actualizar, es decir como tienes las consultas seria algo asi por ejemplo:
Código:
UPDATE negocio.ventas SET cajatotal="2" WHERE cajatotal = (SELECT cajatotal ORDER BY factura LIMIT 1);
Pero evidentemente creo que tu consulta del select deberia preguntar por un id de la tabla ventas es decir algo asi
Código:
UPDATE negocio.ventas SET cajatotal="2" WHERE id_ventas = (SELECT id_ventas ORDER BY factura LIMIT 1);
Espero que veas el problema, seria mas facil si colocaras la estructura de las tablas, pero te digo nuevamente que la consulta que estas haciendo no hace la comparacion con ningun registro en particular por eso te modifica todas las filas.

Salu2
__________________
->Aprender es un proceso que incluye el error..
  #3 (permalink)  
Antiguo 20/07/2009, 17:28
 
Fecha de Ingreso: febrero-2007
Mensajes: 141
Antigüedad: 17 años, 2 meses
Puntos: 1
Respuesta: UPDATE con SELECT anidado

A que te referis con un id_ventas? la tabla factura no puede funcionar como un id de la tabla? ya que la factura no se repite en otras filas..

Igualmente si es asi, hice el update y sigue modificando todas las filas.

Gracias
  #4 (permalink)  
Antiguo 20/07/2009, 18:06
Avatar de Anubis_Slash  
Fecha de Ingreso: mayo-2009
Ubicación: aqui y haya
Mensajes: 173
Antigüedad: 15 años
Puntos: 5
Respuesta: UPDATE con SELECT anidado

de cualquier modo creo que sigue estando mal,

puedes probar esto:

UPDATE negocio.ventas SET cajatotal="2" WHERE id_ventas = (SELECT id_ventas FROM negocio ORDER BY factura LIMIT 1);

creo que hacia falta el FROM en el SELECT, no lo he probado
  #5 (permalink)  
Antiguo 20/07/2009, 19:34
 
Fecha de Ingreso: febrero-2007
Mensajes: 141
Antigüedad: 17 años, 2 meses
Puntos: 1
Respuesta: UPDATE con SELECT anidado

mm.. no, de esa forma me da este error:

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

Otra idea? :S me esta volviendo loco :S
  #6 (permalink)  
Antiguo 21/07/2009, 08:02
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: UPDATE con SELECT anidado

Cita:
SELECT cajatotal ORDER BY factura LIMIT 1;
Esta consulta te devuelve algo? Donde se especifica la tabla ventas?

chnn'
Como dice cala932.. comparte la estructura de las tablas y unos cuantos inserts de la tabla. Con esos datos será mas facil ayudarte.

Un saludo.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #7 (permalink)  
Antiguo 21/07/2009, 11:22
 
Fecha de Ingreso: febrero-2007
Mensajes: 141
Antigüedad: 17 años, 2 meses
Puntos: 1
Respuesta: UPDATE con SELECT anidado

No tmp, de esa forma me dice el siguiente error:

Unknown column 'cajatotal' in 'field list'

La estructura de la tabla es facil.

Factura | Cajatotal
1 | 50
2 | 10

Tengo 2 columnas, Factura y cajatotal. La factura es irrepentible en las demas filas, osea que funciona como un id.

En el ejemplo que le puse de la tabla, necesitaria que a traves de un UPDATE, modifique la ultima fila de la columna cajatotal.
  #8 (permalink)  
Antiguo 21/07/2009, 12:06
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: UPDATE con SELECT anidado

Código sql:
Ver original
  1. UPDATE negocios.ventas SET cajatotal=2
  2. WHERE factura = (SELECT MIN(factura) FROM negocios.ventas);
Te sirve?
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #9 (permalink)  
Antiguo 21/07/2009, 12:31
 
Fecha de Ingreso: febrero-2007
Mensajes: 141
Antigüedad: 17 años, 2 meses
Puntos: 1
Respuesta: UPDATE con SELECT anidado

No, no necesito elejir el numero mas bajo de la tabla, sino, la ultima fila. Ya que a esa tabla se le van agregando filas constantemente.
  #10 (permalink)  
Antiguo 21/07/2009, 12:44
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: UPDATE con SELECT anidado

chnn'... no das suficiente información y es difícil entenderte.

En una tabla se crean constantemente registros.. esto es cierto, pero el orden como tal, debe ser precedido por un campo. De lo contrario, no hay forma de establecer una posición numérica de un registro sin un punto de referencia. Te recomendaría añadir un campo a tu tabla con la fecha de inserción.. de este modo se puede establecer un orden de entrada de registros a la tabla y poder establecer cual es el primero o el ultimo o un valor intermedio.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #11 (permalink)  
Antiguo 21/07/2009, 12:48
 
Fecha de Ingreso: febrero-2007
Mensajes: 141
Antigüedad: 17 años, 2 meses
Puntos: 1
Respuesta: UPDATE con SELECT anidado

El orden de los registros se puede saber por medio de la columna Factura. La cual es autoincrementable.
  #12 (permalink)  
Antiguo 21/07/2009, 12:58
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: UPDATE con SELECT anidado

Cita:
El orden de los registros se puede saber por medio de la columna Factura. La cual es autoincrementable.
No se supone que la ultima fila, sería el menor valor autoincrementable?

Cita:
Lo que hace, es modificarme TODAS las filas y NO la ultima.. alguna idea?
Partiendo de las cosas que dices... la consulta de actualización que te puse

Código sql:
Ver original
  1. UPDATE negocios.ventas SET cajatotal=2
  2. WHERE factura = (SELECT MIN(factura) FROM negocios.ventas);
No estaría actualizando el ultimo registro? El primer valor de la factura (autoincrementable)?

Sinceramente, no te entiendo muy bien que tratas de hacer.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #13 (permalink)  
Antiguo 21/07/2009, 13:12
 
Fecha de Ingreso: febrero-2007
Mensajes: 141
Antigüedad: 17 años, 2 meses
Puntos: 1
Respuesta: UPDATE con SELECT anidado

Si, es cierto lo que decis. Lo probe y tuve que sacar el FROM porq dice que no deja usarlo en un UPDATE.. Pero igualmente es extraño, porque sigue editando todas las filas. :S

Use la consulta siguiente:

UPDATE negocio.ventas SET cajatotal=2 WHERE factura = (SELECT min(factura));

Y me edito todas las filas, es decir, todas las cajatotal quedaron en 2.
  #14 (permalink)  
Antiguo 21/07/2009, 13:24
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: UPDATE con SELECT anidado

tenes razón.

Mira esto:

Código sql:
Ver original
  1. mysql> CREATE TABLE ventas(factura INTEGER PRIMARY KEY AUTO_INCREMENT,cajatotal INTEGER);
  2. Query OK, 0 ROWS affected (0.02 sec)
  3.  
  4. mysql> INSERT INTO ventas (cajatotal) VALUES(4);
  5. Query OK, 1 ROW affected (0.00 sec)
  6.  
  7. mysql> INSERT INTO ventas (cajatotal) VALUES(4);
  8. Query OK, 1 ROW affected (0.00 sec)
  9.  
  10. mysql> INSERT INTO ventas (cajatotal) VALUES(4);
  11. Query OK, 1 ROW affected (0.00 sec)
  12.  
  13. mysql> INSERT INTO ventas (cajatotal) VALUES(4);
  14. Query OK, 1 ROW affected (0.00 sec)
  15.  
  16. mysql> INSERT INTO ventas (cajatotal) VALUES(4);
  17. Query OK, 1 ROW affected (0.02 sec)
  18.  
  19. mysql> INSERT INTO ventas (cajatotal) VALUES(4);
  20. Query OK, 1 ROW affected (0.00 sec)
  21.  
  22. mysql> INSERT INTO ventas (cajatotal) VALUES(4);
  23. Query OK, 1 ROW affected (0.00 sec)
  24.  
  25. mysql> INSERT INTO ventas (cajatotal) VALUES(4);
  26. Query OK, 1 ROW affected (0.00 sec)
  27.  
  28. mysql> SELECT *FROM ventas;
  29. +---------+-----------+
  30. | factura | cajatotal |
  31. +---------+-----------+
  32. |       1 |         4 |
  33. |       2 |         4 |
  34. |       3 |         4 |
  35. |       4 |         4 |
  36. |       5 |         4 |
  37. |       6 |         4 |
  38. |       7 |         4 |
  39. |       8 |         4 |
  40. +---------+-----------+
  41. 8 ROWS IN SET (0.00 sec)
  42.  
  43. mysql> UPDATE ventas SET cajatotal=2 WHERE factura = last_insert_id();
  44. Query OK, 1 ROW affected (0.00 sec)
  45. ROWS matched: 1  Changed: 1  Warnings: 0
  46.  
  47. mysql> SELECT *FROM ventas;
  48. +---------+-----------+
  49. | factura | cajatotal |
  50. +---------+-----------+
  51. |       1 |         4 |
  52. |       2 |         4 |
  53. |       3 |         4 |
  54. |       4 |         4 |
  55. |       5 |         4 |
  56. |       6 |         4 |
  57. |       7 |         4 |
  58. |       8 |         2 |
  59. +---------+-----------+
  60. 8 ROWS IN SET (0.00 sec)
  61.  
  62. mysql>

Te sirve?
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #15 (permalink)  
Antiguo 21/07/2009, 14:26
 
Fecha de Ingreso: febrero-2007
Mensajes: 141
Antigüedad: 17 años, 2 meses
Puntos: 1
Respuesta: UPDATE con SELECT anidado

Perfecto, ya encontre el maldito error. Me sirvio de mucho tu respuesta. De verdad, muchisimas gracias.
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 04:45.