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

Ayuda con esta consulta

Estas en el tema de Ayuda con esta consulta en el foro de Mysql en Foros del Web. tengo que hacer una consulta en la cual selecciono de la tabla facturas2 el valor mas grande que esta en id_requisicion y al tenerlo seleccionado ...
  #1 (permalink)  
Antiguo 19/01/2010, 06:52
 
Fecha de Ingreso: enero-2010
Mensajes: 302
Antigüedad: 14 años, 3 meses
Puntos: 3
Exclamación Ayuda con esta consulta

tengo que hacer una consulta en la cual selecciono de la tabla facturas2 el valor mas grande que esta en id_requisicion y al tenerlo seleccionado restarle la cantidad que tiene el campo de cantidad de la tabla facturas2, al campo cantidad de la tabla activo, claro esta que para que esto suceda estos deben tener el campo descripcion entrelazados o pues que no se le reste a ninguno otro articulo sino es esa descripcion que se describe en facturas2 con el numero mayor de id_requisicion y la cantidad.

no se si me di a entender,

seria algo asi

facturas2
|id_articulo | id_descripcion | unidad | descripcion | cantidad|
````````````````````````````````````````````````
1---------------1--------UND-----Licencia-----2
2---------------2--------UND-----Licencia-----2
3---------------2--------UND-----Mouse-------2

activos
| descripcion | cantidad|
```````````````````
Licencia--------4
Mouse----------4
Cd--------------5
Teclado---------7

la consulta deberia decir que coge el numero mayor de facturas del campo id_requisicion la cogerlo compara que los campos descripcion de las dos tablas sean igual y que al ser iguales le resta el valor de la columna cantidad ubicada en facturas2 al campo cantidad de activos que dando asi:

activos
| descripcion | cantidad|
```````````````````
Licencia--------2
Mouse----------2
Cd--------------5
Teclado---------7

claro esta que hago el select max a id_descripcion y me dice que el numero mayor es 2 en este ejemplo pero no se si hacer ese select mas el update de resta se realize bien la actualizacion de los datos con id_requisicion 2
  #2 (permalink)  
Antiguo 20/01/2010, 06:26
 
Fecha de Ingreso: enero-2010
Mensajes: 302
Antigüedad: 14 años, 3 meses
Puntos: 3
Respuesta: Ayuda con esta consulta

bueno gente me ayudaron con este codigo:

$rs = mysql_query("select descripcion, cantidad from facturas2 where id_requisicion = (select max(id_requisicion) from facturas2)");
while ($row = mysql_fetch_array($rs)){
$cantidad_activo = mysql_result(mysql_query("select cantidad from activo where descripcion = '".$row['descripcion']."'"), 0);
$cantidad_actual = ($cantidad_activo > $row['cantidad']) ? ($cantidad_activo - $row['cantidad']) : 0;
mysql_query("update activo set cantidad = '$cantidad_actual' where descripcion = '".$row['descripcion']."'") or die (mysql_error());
}
}

pero tengo un error, al colocar dos productos para vender me sale id_descripcion not be null o algo asi, actualizo la pagina en la cual me sale el error y lo pasa, pero solo realiza la operacion con el primer producto del segundo producto para arriba no realiza nada, pero si coloco un solo producto no me sale el error ejecuta perfectamente la operacion deseada, a mi parecer creo q es un error con el contador, y en ese sentido si soy nulo con contadores, agradezco la ayuda

Última edición por Sofmundi; 20/01/2010 a las 06:35 Razón: correcion
  #3 (permalink)  
Antiguo 25/01/2010, 07:33
 
Fecha de Ingreso: enero-2010
Mensajes: 302
Antigüedad: 14 años, 3 meses
Puntos: 3
Respuesta: Ayuda con esta consulta

alguien q me ayude ??
  #4 (permalink)  
Antiguo 25/01/2010, 09:26
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Ayuda con esta consulta

sofmundi,
no veo el campo id_requisicion por ninguna parte y no sé exactamente a qué tabla pertenece, aunque parece que es de la tabla facturas. Si se trata del id de esa tabla, y es un id auto_increment, parece como si quisieras buscar la requisición más reciente en fecha y restar a la cantidad de activos la cantidad de ese registro si se trata del mismo producto. ¿Es eso? Si es así, tendrás que hacer un LEFT JOIN para unir las tablas, con activos antes del left join, y usar IFNULL para poder restar los nulos como 0. Creo que puede hacerse con una sola consulta con subconsulta, pero debes confirmar que es eso lo que quieres:
  #5 (permalink)  
Antiguo 27/01/2010, 11:16
 
Fecha de Ingreso: enero-2010
Mensajes: 302
Antigüedad: 14 años, 3 meses
Puntos: 3
Respuesta: Ayuda con esta consulta

si me equivoque, no era id_descripcion sino id_requisicion y el error q sale es asi
"""Column 'id_requisicion' cannot be null""

lo coloco en comillas para decirles especificamente q es lo q sale, cuando sale ese error actualizo la pagina hace el procedimiento con el primer articulo y lo duplica en referente a esto: digo dos articulos a vender y me duplica el primer articulo y en el caso de la resta no se que hizo pero tenia en cantidad del articulo 10 y me dejo en 4 pero bueno eso es algo minimo q creo q se soluciona con que reste a todos los articulos q coloque,
  #6 (permalink)  
Antiguo 27/01/2010, 11:23
 
Fecha de Ingreso: enero-2010
Mensajes: 302
Antigüedad: 14 años, 3 meses
Puntos: 3
Respuesta: Ayuda con esta consulta

@jurena

lo que quiero hacer es como tu lo planteas, y es mas o menos asi: para que me entiendas tengo dos tablas: una es facturas2 y activo, en facturas2 tengo id_requisicion que es por asi llamarlo el numero de la factura y que se duplica de acuerdo a la cantidad de articulos que dije iva a vender, otro campo es descripcion el cual contiene el nombre del articulo a vender, y cantidad que ya sabemos que es y q contiene esto en facturas2.

en activo tengo varios campos, pero los que mas interesan para lo que busco son estos: descripcion que es el nombre del articulo y un campo cantidad que es el stock o la cantidad disponible de este articulo.

lo que busco es: una consulta que me escoja el numero mayor que esta en facturas2.id_requisicion, al tenerlo compare los campos descripcion de ambas tablas y cuando los compare este les reste el valor de facturas2.cantidad a activo.cantidad, con el codigo que tengo arriba no funciona bien cuando escojo dos articulos por que habia comentado que me duplica si digo dos articulos a vender, solo funciona bien con un solo articulo para vender
  #7 (permalink)  
Antiguo 27/01/2010, 17:42
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Ayuda con esta consulta

sofmundi,

si te he entendido bien y no he confundido los nombres de tablas y campos, esto hace, creo, lo que pareces pedir:

Código SQL:
Ver original
  1. UPDATE activos INNER JOIN
  2.  (SELECT t1.id_articulo, t1.id_requisicion, t1.unidad, t1.descripcion, t1.cantidad FROM
  3.        (SELECT id_articulo, id_requisicion, unidad, descripcion, cantidad FROM `facturas2`
  4.               ORDER BY id_requisicion DESC)t1
  5. GROUP BY t1.id_articulo, t1.id_requisicion, t1.descripcion)t2 ON activos.descripcion = t2.descripcion
  6. SET activos.cantidad = activos.cantidad - t2.cantidad

De todas formas, no sé si es exactamente lo mejor para ti. Para hacer la operación una vez y de manera general, tal vez, pero si estás añadiendo cambios quizás deberías intentar alguna otra cosa, porque la próxima vez que la apliques volverás a borrar los mismos valores, en caso de que no se hubiera añadido algo nuevo, y estarías restando algo que ya has restado... Mira eso despacio.

Última edición por jurena; 27/01/2010 a las 17:49
  #8 (permalink)  
Antiguo 27/01/2010, 20:53
 
Fecha de Ingreso: enero-2010
Mensajes: 302
Antigüedad: 14 años, 3 meses
Puntos: 3
Respuesta: Ayuda con esta consulta

@jurena me podrias explicar el codigo es nuevo esa forma del join y como lo expones aca, me puedes decir xq colocas t1.id_articulo y eso gracias,

ademas con este codigo le resto la cantidad q digito a todos los articulos que tengo en facturas2, si quisiera restarselos solo al numero mayor de facturas2.id_requisicion deberia colocar (select max(id_requisicion) from facturas2) pero donde y como lo colocaria

hice el codigo q me pasaste de esta forma

UPDATE activo INNER JOIN
(SELECT t1.descripcion, t1.cantidad FROM
(SELECT max(id_requisicion), descripcion, cantidad FROM `facturas2`
ORDER BY id_requisicion DESC)t1
GROUP BY t1.cantidad, t1.descripcion)t2 ON
activo.descripcion = t2.descripcion
SET activo.cantidad = activo.cantidad - t2.cantidad

y me sucede esto, escoge el facturas2.id_requisicion mayor, pero le resta al que tiene id_articulo menor no al que tiene id_requisicion mayor, de todas formas si me puedes dar la solucion con tu codigo mejor aun gracias, me interesan mas que le haga la resta a los que tienen el facturas2.id_requisicion mayor gracias

Última edición por Sofmundi; 27/01/2010 a las 22:14 Razón: correcion
  #9 (permalink)  
Antiguo 28/01/2010, 00:55
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Ayuda con esta consulta

Bastará, creo, con añadir id_articulo DESC.

Código SQL:
Ver original
  1. UPDATE activos INNER JOIN
  2.  (SELECT t1.id_articulo, t1.id_requisicion, t1.unidad, t1.descripcion, t1.cantidad FROM
  3.        (SELECT id_articulo, id_requisicion, unidad, descripcion, cantidad FROM `facturas2`
  4.               ORDER BY id_requisicion DESC, [B]id_articulo DESC[/B])t1
  5. GROUP BY t1.id_articulo, t1.id_requisicion, t1.descripcion)t2 ON activos.descripcion = t2.descripcion
  6. SET activos.cantidad = activos.cantidad - t2.cantidad

Explicación. Iré comentando "las capas de la cebolla" de este SQL, pero de dentro a fuera:

1) (SELECT id_articulo, id_requisicion, unidad, descripcion, cantidad FROM `facturas2`
ORDER BY id_requisicion DESC, id_articulo DESC)t1
Seleccionas los campos ordenando por id_requisición descendente e id_articulo descendente, y cargas eso en una tabla virtual mediante el alias t1. El orden te colocará primero en esa tabla los que tienen los id_requisicion más altos, y, en caso de coincidencia en el id_requisicion, los que tienen un id_articulo más alto. El objetivo es recoger sólo los datos de id_requisicion más altos, y en caso de coincidencia, los de id_articulo más altos, algo que haremos en el punto 2.

2) (SELECT t1.id_articulo, t1.id_requisicion, t1.unidad, t1.descripcion, t1.cantidad FROM ... GROUP BY t1.id_articulo, t1.id_requisicion, t1.descripcion)t2
seleccionas de esa tabla virtual los campos, pero agrupando por id_articulo, id_requisicion, y descripcion, lo cual te deja, de los que coinciden en esos valores, el que está más arriba de la lista de la tabla virtual t1. Y a esa tabla virtual la llamas t2. No olvides que el GROUP BY, en caso de coincidencia de valor de campo agrupado, conserva el primer valor coincidente y los campos de ese registro.

3) UPDATE activos INNER JOIN... ON activos.descripcion = t2.descripcion ... SET activos.cantidad = activos.cantidad - t2.cantidad
cruzo las tabla activos con el resultado de la selección de 2, es decir con la tabla virtual t2, uniendo por descripcion (es el campo que coincide), y actualizo activos.cantidad poniendo en su lugar lo que había menos el valor de cantidad en la t2.

Última edición por jurena; 28/01/2010 a las 01:46
  #10 (permalink)  
Antiguo 02/02/2010, 16:23
 
Fecha de Ingreso: enero-2010
Mensajes: 302
Antigüedad: 14 años, 3 meses
Puntos: 3
Respuesta: Ayuda con esta consulta

@jurena es esto

facturas2
|id_articulo | id_descripcion | unidad | descripcion | cantidad|
````````````````````````````````````````````````
1---------------1--------UND-----Licencia-----2
2---------------2--------UND-----Licencia-----2
3---------------2--------UND-----Mouse-------2

activo
| descripcion | cantidad|
```````````````````
Licencia--------4
Mouse----------4
Cd--------------5
Teclado---------7

la consulta deberia decir que coge el numero mayor de facturas del campo id_requisicion la cogerlo compara que los campos descripcion de las dos tablas sean igual y que al ser iguales le resta el valor de la columna cantidad ubicada en facturas2 al campo cantidad de activos que dando asi:

activo
| descripcion | cantidad|
```````````````````
Licencia--------2
Mouse----------2
Cd--------------5
Teclado---------7

claro esta que hago el select max a id_descripcion y me dice que el numero mayor es 2 en este ejemplo pero no se si hacer ese select mas el update de resta se realize bien la actualizacion de los datos con id_requisicion 2

si coloco este codigo que me ayudaste mas una modificacion, me realiza la resta escogiendo todo a los articulos que esten dentro de facturas2 y restandoselos a la tabla activo

UPDATE activo INNER JOIN
(SELECT max(t1.id_requisicion), t1.unidad, t1.descripcion, t1.cantidad FROM
(SELECT id_articulo, id_requisicion, unidad, descripcion, cantidad FROM `facturas2`
ORDER BY id_requisicion DESC)t1
GROUP BY t1.id_articulo, t1.id_requisicion, t1.descripcion)t2 ON activo.descripcion = t2.descripcion
SET activo.cantidad = activo.cantidad - t2.cantidad

Última edición por Sofmundi; 02/02/2010 a las 16:35

Etiquetas: Ninguno
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 13:45.