2017-01-17 16 views
1

Ich habe eine Liste von items, die zu orders gehören. Jedes item hat fee_percentage Feld. und die Summe von items ist total_price in orders Tabelle.Wie den letzten zugehörigen Datensatz zu aktualisieren

Was möchte ich erreichen? Ich möchte das Feld fee der zuletzt verknüpften Elemente aktualisieren.

_________________________  __________________________________________ 
| order ID | total_price|  | id | order_id | fee_percentage | fee | 
-------------------------  ------------------------------------------ 
| 334 |  425 |  | 1 | 334 |  50  | 212 | 
    # The `fee` should be 213 => | 2 | 334 |  50  | 212 | 

Wie Sie die Summe von items wird sehen 424. I fee die verbleibende Gebühr zum letzten Punkt hinzufügen möchten. (Also sollte die Gebühr von Artikel-ID 2 213 sein).

Irgendwelche Hilfe bitte?

Dies ist, was ich

bisher geschrieben habe
UPDATE items AS i 
LEFT JOIN orders AS o ON o.order_id = b.order_id 
LEFT JOIN (
    SELECT order_id, SUM(fee) AS sum_fee 
    FROM items 
    GROUP BY order_id 
    WHERE deleted = 0 
) AS b1 ON b1.order_id = b.order_id 
SET b.fee = b.fee + (o.total_price - b1.sum_fee) 
WHERE b.deleted = 0; 

Ich habe versucht, es zu vorheriger Abfrage zu befestigen oder die last_item_id in Aufträgen Datensatz aktualisieren, aber es funktioniert nicht.

LEFT JOIN (
    SELECT order_id, MAX(id) AS b_last_item_id 
    FROM items 
    WHERE deleted = 0 
    GROUP BY order_id  
) AS b1 ON b1.order_id = b.order_id 
+0

Siehe http://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-be-a-very -simple-sql-query – Strawberry

Antwort

0
UPDATE items AS b 
    JOIN (
     SELECT MAX(i.id) mid, o.curr_price - SUM(i.fee) AS diff 
     FROM items AS i 
     INNER JOIN orders AS o ON i.order_id = o.order_id 
     GROUP BY i.order_id 
     ORDER BY i.order_id, i.id 
    ) AS v ON b.id = v.mid 
    SET b.fee = b.fee + v.diff WHERE v.diff <> 0; 
+0

Es scheint auch zu funktionieren. –

+1

Viel schneller und genauer. – Fury

1

Dies ist ein bisschen schwierig. Ich denke, die folgende Abfrage funktionieren soll:

UPDATE items AS i 
JOIN orders AS o ON i.order_id = o.orderID 
JOIN (
    SELECT order_id, SUM(fee) AS sum_of_fees 
    FROM items 
    GROUP BY order_id 
) AS i2 ON i2.order_id = o.orderID 
LEFT JOIN items AS i3 
    ON i3.order_id = o.orderID AND i3.id > i.id 
SET i.fee = o.total_price - (sum_of_fees - i.fee) 
WHERE i3.id IS NULL; 

Die abgeleitete Tabelle verwendet, um die Summe der Gebühren pro order_id berechnet. Mit diesem Wert wir die Summe aller Einzelteile berechnen kann, aber das aktuelle Element als:

SUM(fee) - i.fee 

Eine zusätzliche LEFT JOIN-items Tabelle benötigt wird, um den Datensatz mit dem maximalen id Wert, der der Datensatz zu identifizieren, ist wird gerade aktualisiert.

Verwandte Themen