Seleziona dai record MySQL che sommano
-
03-07-2019 - |
Domanda
So che ci sono alcuni post qui sulla selezione dei record fino a quando non viene raggiunto un certo numero dalla somma di un campo, ma non ce n'è uno adatto a me. Sto usando PHP e MySQL.
Ho una tabella chiamata quantità. All'interno ci sono record di nome del prodotto, prezzo del prodotto e quantità del prodotto. Oltre a questi, ce ne sono alcuni altri che mi aiutano a selezionare gli ultimi record in base alla data e alla posizione, nonché a GROUP BY nel campo denominato price perché ci sono quantità diverse con prezzi diversi per lo stesso prodotto. Quindi, attualmente seleziono il prezzo specifico del mio prodotto e la quantità in questo modo:
SELECT `price`,`quantity` FROM (SELECT `price`,`quantity` FROM `quantity` WHERE `product_name` = 'DELL' ORDER BY `date` DESC, `position`) AS `Actions` GROUP BY `price`
Questa query è una soluzione alternativa perché ho bisogno di ottenere dati come questo:
product_name | price | quantity
DELL | 100 | 30
DELL | 120 | 10
DELL | 130 | 2
supponendo che io abbia più dischi come questi e ho bisogno di ottenerne gli ultimi. Ad ogni modo, da questa query devo fare quanto segue: Devo selezionare i record la cui quantità sommata con la quantità di un altro prodotto è 35. Quindi, usando la mia query, so che dovrebbe fermarsi alla riga 2 perché posso prendere i 30 prodotti che è venuto con il prezzo di $ 100 e altri 5 prodotti della linea 2 che ha un prezzo di 120. E quindi avrei bisogno di inserire i miei aggiornamenti. Quindi, i nuovi dati sarebbero simili:
product_name | price | quantity
DELL | 100 | 0
DELL | 120 | 5
DELL | 130 | 2
In che modo riuscirò a raggiungere questo obiettivo? Spero che i miei dettagli siano chiari. Per favore, fai qualsiasi domanda.
Grazie per il tuo tempo!
Soluzione
Opzione 1: utilizzare la logica del programma anziché una query:
Non c'è nulla di sbagliato nell'utilizzo del livello di programmazione per eseguire interazioni di database più avanzate. SQL non è una risposta a tutto ... (Considera anche una procedura memorizzata).
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
Opzione 2: utilizza una query con un totale parziale:
In questa opzione, si ottiene un totale parziale utilizzando una query derivata, quindi filtrandolo fino a record specifici nella query esterna. Se intendi aggiornarli, dovresti inserirlo in una transazione con il giusto livello di isolamento.
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
Preferirei preferire l'opzione 1 perché è più "ovvia", ma forse questo ti darà un po 'di spunti di riflessione.