Pregunta

Sé que hay algunas publicaciones aquí sobre la selección de registros hasta que se alcanza un cierto número de la suma de un campo, pero no hay ninguno que se adapte a mí. Estoy usando PHP y MySQL.

Tengo una tabla llamada cantidad. En el interior hay registros del nombre del producto, el precio del producto y la cantidad del producto. Además de estos, hay algunos otros que me ayudan a seleccionar los últimos registros según la fecha y la posición, así como un GRUPO POR el campo llamado precio porque hay diferentes cantidades con diferentes precios para el mismo producto. Por lo tanto, actualmente selecciono el precio específico de mi producto y la cantidad como esta:

SELECT `price`,`quantity` FROM (SELECT `price`,`quantity` FROM `quantity` WHERE `product_name` = 'DELL' ORDER BY `date` DESC, `position`) AS `Actions` GROUP BY `price`

Esta consulta es una solución porque necesito obtener datos como este:

product_name   |    price  |    quantity

DELL           |     100   |      30
DELL           |     120   |      10
DELL           |     130   |      2

Suponiendo que tengo varios registros como estos y necesito obtener el último de ellos. De todos modos, a partir de esta consulta debo hacer lo siguiente: Necesito seleccionar los registros cuya cantidad sumada con la cantidad de otro producto es igual a 35. Por lo tanto, al usar mi consulta, sé que debería detenerse en la línea 2 porque puedo tomar los 30 productos. que vino con el precio de $ 100 y otros 5 productos de la línea 2 que tiene un precio de 120. Y luego tendría que ingresar mis actualizaciones. Entonces, los nuevos datos se verían así:

product_name   |    price  |    quantity

DELL           |     100   |      0
DELL           |     120   |      5
DELL           |     130   |      2

¿Cómo en el mundo voy a lograr esto? Espero que mis detalles sean claros. Por favor, haga cualquier pregunta.

¡Gracias por tu tiempo!

¿Fue útil?

Solución

Opción 1: use la lógica del programa en lugar de una consulta:

No hay nada de malo en usar la capa de programación para hacer interacciones de base de datos más avanzadas. SQL no es una respuesta para todo ... (También considere un procedimiento almacenado).

enough = 35
running_total = 0

START TRANSACTION
while running_total < enough:
    select one record order by price limit 1 FOR UPDATE
    add to running_total

UPDATE records...
COMMIT

Opción 2: usar una consulta con un total acumulado:

En esta opción, obtiene un total acumulado utilizando una consulta derivada y luego la filtra a registros específicos en la consulta externa. Si tiene la intención de actualizarlos, debe envolver esto en una transacción con el nivel de aislamiento adecuado.

SET @running_total = 0;
SELECT
    row_id,
    product_name,
    price,
    quantity
FROM
    (
    SELECT 
        row_id, 
        product_name, 
        price, 
        quantity, 
        @running_total := @running_total + quantity AS running_total
    FROM 
        sometable
    WHERE
        quantity > 0
    ORDER BY
        quantity
    LIMIT 
        35  /* for performance reasons :) */
    ) as T1
WHERE
    running_total < 35

Tiendo a preferir la opción 1 porque es más "evidente", pero quizás esto te dé algo para pensar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top