2012-09-23 28 views
8

Ho due tabelle: ITEMS con quantità e unit_price (id | nome | order_id | qt | unit_price) e tavolo ORDERS.MySQL UPDATE con SUM SELECT dalla tabella diversa

Voglio UPDATE tabella orders e inserire in orders.total_price sum of multiplications qt*unit_price per gli stessi ordini per ottenere il prezzo totale dell'ordine.

La query SELECT sulla tabella degli elementi è molto semplice e funziona bene giving somme per tutti gli elementi all'interno della stessa order_id:

SELECT SUM(items.qt*items.unit_price) from items GROUP by items.order_id 

ma non posso inserire questo valore nella mia ORDERS tavolo. Non ho potuto fare questo lavoro:

UPDATE orders, items SET orders.total_price = (SELECT SUM(items.qt*items.unit_price) 
FROM items GROUP BY items.order_id) WHERE orders.id = items.order_id 

restituisce "Subquery returns more than 1 row"

ho trovato una domanda molto simile here ma la risposta non ha funzionato anche per me:

UPDATE orders SET orders.t_price = (SELECT SUM(items.qt*items.unit_price) from items WHERE orders.id = items.order_id) 
+0

per favore mostra la tua domanda completa cosa stai facendo come mysql_query ("query") –

+1

Lo sto facendo per ora in phpmyadmin quindi la seconda query sopra è la query effettiva che provo: "UPDATE orders, items SET orders.total_price = (SELECT SUM (items.qt * items.unit_price) FROM items GROUP BY items.order_id) WHERE orders.id = items.order_id " – Milosz

risposta

13

Puoi UPDATE con JOIN nelle due tabelle:

UPDATE Orders o 
INNER JOIN 
(
    SELECT order_id, SUM(qt * unit_price) 'sumu' 
    FROM items 
    GROUP BY order_id 
) i ON o.id = i.order_id 
SET o.total_price = i.sumu 
[WHERE predicate] 
+0

Grazie. Cosa dovrebbe dire [WHERE predicate]? Senza che questo influisce su 0 righe e con "WHERE o.id = i.order_id" interessa anche 0 righe. – Milosz

+0

@ user1692064 è possibile utilizzare la clausola 'WHERE' per fornire condizioni aggiuntive per aggiornare la colonna specificata solo se questa condizione fosse vera, notare che questa clausola è facoltativa e scriverla se ne ha bisogno. Inoltre ci sono state 0 righe interessate perché potrebbero non esserci campi che soddisfano la condizione di join che è 'ON o.id = i.order_id' –

+0

Mi dispiace fosse la mia mancanza di conoscenza che mysql in phpmyadmin ignora in" valori interessati "quei record che hanno già lo stesso valore. Devo aver avuto i valori corretti in tutti i record prima, giocando con diverse query diverse. Grazie. – Milosz