2009-03-03 18 views
1

Ich weiß, es gibt ein paar Post hier über die Auswahl von Datensätzen, bis eine bestimmte Anzahl von der Summe von einem Feld erfüllt ist, aber es gibt keine, die mir passt. Ich benutze PHP und MySQL.Wählen Sie aus MySQL Datensätze, die Summen

Ich habe eine Tabelle namens Menge. Im Inneren befinden sich Aufzeichnungen über Produktname, Produktpreis und Produktmenge. Abgesehen von diesen gibt es einige andere, die mir helfen, die letzten Datensätze basierend auf Datum und Position auszuwählen, sowie ein GROUP BY-Feld mit dem Namen price, da es verschiedene Mengen mit unterschiedlichen Preisen für dasselbe Produkt gibt. Also, ich derzeit mein Produkt spezifischen Preis und Menge wie folgt wählen:

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

Diese Abfrage eine Abhilfe ist, weil ich Daten wie diese müssen bekommen:

product_name | price | quantity 

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

asuming, dass ich mehrere Datensätze wie diese haben und ich muss die neuesten von ihnen bekommen. Wie auch immer, aus dieser Abfrage muss ich Folgendes tun: Ich muss die Datensätze auswählen, deren Menge mit der Menge eines anderen Produkts gleich 35 ist. Mit meiner Abfrage weiß ich also, dass sie bei Zeile 2 aufhören sollte, weil ich die 30 Produkte nehmen kann das kam mit dem Preis von $ 100 und weitere 5 Produkte von der Linie 2, die Preis von 120 hat. Und dann würde ich meine Updates eingeben müssen. So würde sich die neuen Daten wie:

product_name | price | quantity 

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

Wie in der Welt werde ich dies erreichen? Ich hoffe meine Details sind klar. Bitte, stellen Sie eine Frage.

Vielen Dank für Ihre Zeit!

Antwort

1

Option 1: Verwenden Sie die Programmlogik anstelle einer Abfrage:

Es ist nichts falsch mit der Programmierschicht mit erweiterten Datenbank-Interaktionen zu tun. SQL ist keine Antwort auf alles ... (Betrachte auch eine gespeicherte Prozedur).

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 

Option 2: Verwenden Sie eine Abfrage mit einer laufenden Summe:

Bei dieser Option erhalten Sie eine laufende Summe eine abgeleitete Abfrage verwenden, und dann, dass filtern, um bestimmte Datensätze nach unten in die äußere Abfrage. Wenn Sie beabsichtigen, sie zu aktualisieren, sollten Sie dies in eine Transaktion mit der richtigen Isolationsstufe einbinden.

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 

würde ich dazu neigen, die Option 1 bevorzugen, weil es „offensichtlich“ ist, aber vielleicht wird dies Ihnen zu denken, etwas zu essen geben.

+0

Ich habe die erste Methode verwendet. Ich muss jedoch viel arbeiten. Jedenfalls hat mir das geholfen. Vielen Dank –

Verwandte Themen