2013-01-22 12 views
13

Questo bit di lavoro grande:MYSQL aggiornamenti tramite sum() tradurrà in più tabelle

SELECT products_id, sum(attributes_stock) 
FROM products_attributes 
GROUP BY products_id 

che aggiunge insieme tutti i gruppi di campi nella colonna attributes_stock.

Quello che sto avendo problemi è ottenere questo risultato per AGGIORNARE un'altra colonna in un'altra tabella.

Questo è quello che ho:

UPDATE products, products_attributes 
SET products.products_quantity = sum(products_attributes.attributes_stock) GROUP BY products_attributes.products_id 
WHERE products.products_id = products_attributes.products_id 

Qualche consiglio molto apprezzato.

risposta

21

Non è possibile utilizzare un group by all'interno di un'istruzione di aggiornamento. Avrai bisogno di usare una sub-selezione per fare il raggruppamento.

Qualcosa di simile a questo:

UPDATE products p,(SELECT products_id, sum(attributes_stock) as mysum 
        FROM products_attributes GROUP BY products_id) as s 

    SET p.products_quantity = s.mysum 
    WHERE p.products_id = s.products_id 
+0

@windywah controlla il mio aggiornamento – Ray

+0

Sei il ma n @ Ray, ha funzionato un piacere !! grazie molto!!! – windywah

1

Prova questa:

update 
    products, 
    (select 
     products_id, sum(attributes_stock) as sumAttr 
    from products_attributes 
    group by products_id) as a 
set 
    products.products_cuantity = a.sumAttr 
where 
    products.products_id = a.products_id 
7

Alcuni favoriscono lo stile più recente JOIN ... ON sintassi per un'operazione di join, contro l'operatore virgola e il predicato di join in WHERE clausola:

UPDATE products p 
    JOIN (SELECT q.products_id 
       , SUM(q.attributes_stock) AS sum_attr 
      FROM products_attributes q 
      GROUP BY q.products_id 
     ) r 
    ON r.products_id = p.products_id 
    SET p.products_quantity = r.sum_attr 
+0

... non dimenticare la clausola "where" se non vuoi aggiornare ogni riga della tabella. – SEoF

+0

Devo anche aggiungere: la sintassi "JOIN ... ON" può effettivamente migliorare le prestazioni delle query quando si uniscono 3 o più tabelle. – SEoF

+1

Un altro vantaggio della sintassi 'JOIN' è che se vuoi aggiornare anche i prodotti (set' quantity = 0') che non hanno stock, puoi facilmente cambiare il join in 'LEFT JOIN'. –