Frage

Ich weiß, dass es ein paar Posten sind hier aus über die Auswahl von Datensätzen, bis eine bestimmte Zahl aus der Summe eines Feldes erfüllt ist, aber es gibt keine, die zu mir passt. Ich bin mit PHP und MySQL.

Ich habe eine Tabelle mit dem Namen Menge. Im Innern gibt es Aufzeichnungen von Produktnamen, Produktpreis und die Produktmenge. Neben diesen gibt es ein paar andere, die ich die letzten Aufzeichnungen helfen wählen basierend auf Datum und Position, aswell als GROUP BY das Feld mit dem Namen Preis, weil es unterschiedliche Mengen mit unterschiedlichen Preisen für das gleiche Produkt. Also, ich derzeit mein Produkt spezifischen Preis und Menge wie folgt aus:

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 ist eine Abhilfe, weil ich Daten wie diese müssen bekommen:

product_name   |    price  |    quantity

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

asuming, die ich habe mehrere Datensätze wie diese, und ich brauche die neueste von ihnen zu bekommen. Wie auch immer, diese Abfrage muß ich folgendes tun: Ich brauche die Datensätze auszuwählen, die Menge mit einem anderen Produkt der Menge summiert ist gleich 35. So, durch meine Abfrage ich weiß, dass es in Zeile 2 sollte aufhören, weil ich die 30 Produkte nehmen das kam mit dem Preis von $ 100 und weiteren 5 Produkten aus der Linie 2, den Preis von 120 hat und dann würde ich muß mein Updates eingeben. So würden die neuen Daten wie folgt aussehen:

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 klar sind. Fordern Sie bitte jede Frage.

Vielen Dank für Ihre Zeit!

War es hilfreich?

Lösung

Option 1: Verwenden Sie die Programmlogik anstelle einer Abfrage:

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

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 die Filter nach unten auf bestimmte Datensätze in der äußeren Abfrage. Wenn Sie an der Aktualisierung sie beabsichtigen, sollten Sie wickeln diese in einer Transaktion mit der rechten Isolationsstufe.

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 diese geben Ihnen einige Denkanstöße.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top