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!

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top