2013-01-22 48 views
13

này bit làm việc tuyệt vời:MYSQL Cập nhật bằng sum() kết quả trên nhiều bảng

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

nào thêm cùng tất cả các nhóm lĩnh vực trong cột attributes_stock.

Điều tôi đang gặp phải là nhận kết quả này để CẬP NHẬT một cột khác trong bảng khác.

Đây là những gì tôi có:

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 

Bất cứ lời khuyên đánh giá rất cao.

Trả lời

21

Bạn không thể sử dụng group by bên trong câu lệnh cập nhật. Bạn sẽ cần phải sử dụng một phụ chọn để làm nhóm.

Something như thế này:

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 kiểm tra cập nhật của tôi – Ray

+0

Bạn là ma n @Ray, làm việc một điều trị !! cảm ơn nhiều!!! – windywah

1

Hãy thử điều này:

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

Một số ủng hộ các kiểu mới JOIN ... ON cú pháp cho một hoạt động tham gia, so với các nhà điều hành dấu phẩy và tham gia vị trong WHERE khoản:

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

... đừng quên mệnh đề "where" nếu bạn không muốn cập nhật mọi hàng trong bảng. – SEoF

+0

Tôi cũng nên thêm - cú pháp "THAM GIA ... BẬT" thực sự có thể cải thiện hiệu suất của các truy vấn khi tham gia 3 hoặc nhiều bảng. – SEoF

+1

Một ưu điểm khác của cú pháp 'JOIN' là nếu bạn muốn cập nhật các sản phẩm (đặt' quantity = 0') mà không có cổ phiếu nào cả, bạn có thể dễ dàng thay đổi kết nối thành 'LEFT JOIN'. –

Các vấn đề liên quan