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

[SOLUCIONADO] Duda con consulta

Estas en el tema de Duda con consulta en el foro de Mysql en Foros del Web. Compañeros, tengo esta consulta @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código MySQL: Ver original SELECT id , fecha , idproducto , costo , cantidad   FROM (   SELECT ...
  #1 (permalink)  
Antiguo 05/07/2014, 19:20
 
Fecha de Ingreso: agosto-2013
Ubicación: Guatemala
Mensajes: 137
Antigüedad: 11 años, 4 meses
Puntos: 4
Duda con consulta

Compañeros, tengo esta consulta
Código MySQL:
Ver original
  1. SELECT id, fecha, idproducto, costo, cantidad
  2.   FROM
  3. (
  4.   SELECT id, fecha, idproducto, costo, cantidad, @t := @t + cantidad as total
  5.     FROM existencia CROSS JOIN (SELECT @t := 0) i
  6.    ORDER BY fecha DESC
  7. ) q
  8.  WHERE total<=26
la tabla de la cual extraigo los datos es esta

Código MySQL:
Ver original
  1. id | fecha | idproducto | costo | cantidad
  2. 1 | 2014-07-03 |   1  | 8.10 | 10
  3. 2 | 2014-07-04 |   1  | 8.05 | 15
  4. 3 | 2014-07-05 |   1  | 8.12 | 20
entonces en teoría me debería de seleccionar el registro 2 y 3 para hacer la suma pero solamente me selecciona el 3 osea asi

Código MySQL:
Ver original
  1. id | fecha | idproducto | costo | cantidad
  2. 3 | 2014-07-05 |   1  | 8.12 | 20
Encontré este otro codigo que si funciona pero solo en mysql y no se como aplicarlo para usarlo en PHP
Código MySQL:
Ver original
  1. SET @var_amount = 22;
  2. SELECT existencia.*, if ((@var_amount := @var_amount - ex_cantidad) > 0, ex_cantidad, ex_cantidad +  @var_amount) as total
  3. FROM existencia
  4. WHERE idproducto = 1
  5. ORDER BY ex_fecha DESC
  6. ) AS tmp
  7. WHERE total > 0
Espero que me puedan ayudar
  #2 (permalink)  
Antiguo 06/07/2014, 20:24
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Duda con consulta

En realidad, no hay ningún error. Lo que pasa es que sólo uno de los registros cumple con la premisa de total <=24.
Para que quede claro, voy a reconstruir la tabla en base a tu descripción y agregarle los datos indicados por ti:
Código MySQL:
Ver original
  1. mysql> DROP TABLE IF EXISTS existencia ;
  2. Query OK, 0 rows affected (0.03 sec)
  3.  
  4. mysql> CREATE TABLE IF NOT EXISTS existencia (
  5.     ->     fecha DATE,
  6.     ->     idproducto INT UNSIGNED,
  7.     ->     costo DECIMAL(10 , 2 ),
  8.     ->     cantidad INT UNSIGNED
  9.     -> );
  10. Query OK, 0 rows affected (0.05 sec)
  11.  
  12. mysql> INSERT INTO existencia
  13.     -> VALUES
  14.     -> (1, '2014-07-03', 1, 8.10, 10),
  15.     -> (2, '2014-07-04', 1, 8.05, 15),
  16.     -> (3, '2014-07-05', 1, 8.12, 20);
  17. Query OK, 3 rows affected (0.00 sec)
  18. Records: 3  Duplicates: 0  Warnings: 0

Ahora, vamos a ejecutar sólo la subconsultla interna, sin la exterior ni la condición, de modo que se vea qué valores va obteniendo la columna "TOTAL":
Código MySQL:
Ver original
  1. mysql> SELECT
  2.     ->     id,
  3.     ->     fecha,
  4.     ->     idproducto,
  5.     ->     costo,
  6.     ->     cantidad,
  7.     ->     (@T:=@T + cantidad) total
  8.     -> FROM
  9.     ->     existencia
  10.     ->          JOIN
  11.     ->     (SELECT @T:=0) i
  12.     -> ORDER BY fecha DESC;
  13. +----+------------+------------+-------+----------+-------+
  14. | id | fecha      | idproducto | costo | cantidad | total |
  15. +----+------------+------------+-------+----------+-------+
  16. |  3 | 2014-07-05 |          1 |  8.12 |       20 |    20 |
  17. |  2 | 2014-07-04 |          1 |  8.05 |       15 |    35 |
  18. |  1 | 2014-07-03 |          1 |  8.10 |       10 |    45 |
  19. +----+------------+------------+-------+----------+-------+
  20. 3 rows in set (0.00 sec)

Como puedes ver, sólo uno de los registros es menor o igual a 24, por lo que si pongo tu query, el resultado es:
Código MySQL:
Ver original
  1. mysql> SELECT id, fecha, idproducto, costo, cantidad, total
  2.     ->   FROM
  3.     -> (SELECT id, fecha, idproducto, costo, cantidad, @t := @t + cantidad as total
  4.     ->     FROM existencia JOIN (SELECT @t := 0) i
  5.     ->    ORDER BY fecha DESC) q
  6.     ->  WHERE total<=26;
  7. +----+------------+------------+-------+----------+-------+
  8. | id | fecha      | idproducto | costo | cantidad | total |
  9. +----+------------+------------+-------+----------+-------+
  10. |  3 | 2014-07-05 |          1 |  8.12 |       20 |    20 |
  11. +----+------------+------------+-------+----------+-------+
  12. 1 row in set (0.00 sec)
Lo que es totalmente correcto.
Entonces, el "error" consiste en que quieres tomar los registros sobre un valor que no es el "total", sino la "cantidad" de cada uno. Creo que lo que tienes es un error de definición de lo que realmente quieres obtener...
Básicamente, el campo a comparar para que salgan los tres registros, no es ese:

Código MySQL:
Ver original
  1. mysql> SELECT
  2.     ->     id, fecha, idproducto, costo, cantidad, total
  3.     -> FROM
  4.     ->     (SELECT
  5.     ->         id,
  6.     ->             fecha,
  7.     ->             idproducto,
  8.     ->             costo,
  9.     ->             cantidad,
  10.     ->             @t:=@t + cantidad as total
  11.     ->     FROM
  12.     ->         existencia
  13.     ->     JOIN (SELECT @t:=0) i
  14.     ->     ORDER BY fecha DESC) q
  15.     -> WHERE
  16.     ->     cantidad <= 26;
  17. +----+------------+------------+-------+----------+-------+
  18. | id | fecha      | idproducto | costo | cantidad | total |
  19. +----+------------+------------+-------+----------+-------+
  20. |  3 | 2014-07-05 |          1 |  8.12 |       20 |    20 |
  21. |  2 | 2014-07-04 |          1 |  8.05 |       15 |    35 |
  22. |  1 | 2014-07-03 |          1 |  8.10 |       10 |    45 |
  23. +----+------------+------------+-------+----------+-------+

Cita:
Encontré este otro codigo que si funciona pero solo en mysql y no se como aplicarlo para usarlo en PHP
El código SQL no es "aplicable" a PHP. PHP no interpreta SQL, ni MySQL entiende PHP. Son entornos de existencia diferentes. PHP lo único que puede hacer es enviar la query a MySQL, e interpretar lo que MySQL le responde. En ese sentido, con PHP lo que debes hacer es usar los resultados.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 06/07/2014 a las 20:31
  #3 (permalink)  
Antiguo 07/07/2014, 09:15
 
Fecha de Ingreso: agosto-2013
Ubicación: Guatemala
Mensajes: 137
Antigüedad: 11 años, 4 meses
Puntos: 4
Respuesta: Duda con consulta

Gracias por tu explicación gnzsoloyo fijate que logré hacer correr el query en php lo que hice fue lo siguiente

Código MYSQL:
Ver original
  1. SET @cifra=$cifra;
  2. SELECT existencia.*, if ((@cifra := @cifra - cantidad) > 0, cantidad, cantidad +  @cifra) as total
  3. FROM existencia
  4. WHERE idproducto = 1
  5. ) AS tmp
  6. WHERE total > 0
Cita:
Editado: código de programación no permitido en foro de base de datos.

Última edición por gnzsoloyo; 07/07/2014 a las 09:23

Etiquetas: consulta-mysql
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 00:10.