2013-02-21 45 views
5

Tôi đang làm việc với một bảng (kết quả) có cơ cấu như sau (đừng hỏi, tôi không xây dựng nó)MySql CẬP NHẬT với SUM trong cùng một bảng

id | record_type | user_id | answer_id | choice | score | total | email 
------------------------------------------------------------------------------- 
1 email   xxxxxxx         0  [email protected] 
2 answer  xxxxxxx aaaaaa  A  0 
3 answer  xxxxxxx bbbbbb  A  0 
4 answer  xxxxxxx cccccc  B  10 
5 email   yyyyyyy         0  [email protected] 
6 answer  yyyyyyy aaaaaa  A  0 
7 answer  yyyyyyy bbbbbb  A  0 
8 answer  yyyyyyy cccccc  A  0 
9 email   zzzzzzz         0  [email protected] 
10 answer  zzzzzzz aaaaaa  A  0 
11 answer  zzzzzzz bbbbbb  A  0 
12 answer  zzzzzzz cccccc  B  10 

Đó là một cuộc khảo sát và giá trị điểm của các câu trả lời chính xác đã thay đổi sau khi các cuộc điều tra đã được gửi. Tôi đã chạy bản cập nhật để đặt giá trị điểm cho câu trả lời "đúng" thành 10 và bây giờ tôi cần cập nhật tổng số cho các hàng có record_type: email để chúng tôi có thể liên hệ với người chiến thắng.

Mục tiêu sẽ được thiết lập tổng cột cho các hàng 1,5 và 9 là 10,0 và 10

Tôi đang nghĩ đến một cái gì đó như thế này

UPDATE results SET total = SUM(score) 
FROM results GROUP BY user_id WHERE user_id = user_id 

Nhưng điều đó không' Tôi nhìn đúng và tôi lo lắng rằng tôi có thể đi sai đường.

Trả lời

8
UPDATE 
     results AS r 
    JOIN 
     (SELECT user_id, 
        SUM(score) AS sum_score 
      FROM  results 
      WHERE record_type = 'answer' 
      GROUP BY user_id 
     ) AS grp 
     ON 
      grp.user_id = r.user_id 
SET 
     r.total = grp.sum_score 
WHERE 
     r.record_type = 'email'; 

hiệu quả Về, một chỉ mục trên (record_type, user_id, score) sẽ giúp cả hai để tính toán một cách hiệu quả các bảng có nguồn gốc và với sự tự tham gia.

+0

hoạt động. Rất đẹp. Cảm ơn bạn. – byron

+0

Câu hỏi dành cho các bạn ... Tôi đang chạy bảng này với ~ 400 nghìn hàng và nó đang bị lỗi (có thể hết bộ nhớ). Bất kỳ đề xuất để giải quyết? Giống như, một cách để chạy truy vấn theo khối? – byron

+0

Điều này có thể trông "phức tạp" nhưng thực sự dễ thực hiện và hoạt động như một giấc mơ (bạn cần một chỉ mục duy nhất, tôi phải tạo một chỉ số cho yêu cầu của mình) – zzapper

3

Bạn sắp hoàn tất.

UPDATE results r SET total = 
    (select SUM(score) FROM results r2 
    WHERE r2.user_id = r.user_id 
    and r2.record_type = 'answer') 
where r.record_type = 'email'; 

này nên làm việc

+1

Nó sẽ không hoạt động trên máy chủ MySQL. http://stackoverflow.com/questions/653826/update-with-sum-in-mysql – Kamil

+1

Nó trả về 'Mã lỗi: 1093. Bạn không thể chỉ định bảng mục tiêu 'r' để cập nhật trong mệnh đề FROM' – Kamil

+0

Wow, đã làm việc cho trường hợp của tôi. Những người nói rằng nó không hoạt động, bạn sẽ chỉ thay đổi nó để phù hợp với trường hợp của bạn xin vui lòng! –

-2

Xin chào tôi đã theo dõi bản cập nhật ur nhưng xảy ra lỗi Missing set key word.

Dưới đây là tuyên bố cập nhật.

UPDATE IFRS_SIT_USER.t_318038 AS r 
    JOIN 
     (SELECT business_unit, Report_no, Y_Ordinate, 
          SUM(Calc_Permata_amt) AS sum_calc_amt 
      FROM IFRS_SIT_USER.t_318038 
      WHERE business_unit = 'DA-01-PERMATA' and Report_no='F 12.00' and asof_date='31-Mar-2017' 
      GROUP BY Y_Ordinate, business_unit, Report_no 
) AS grp 
     ON 
      grp.Y_Ordinate= r.Y_Ordinate 
SET 
     r.Fnl_Calc_Permta_amt=grp.sum_calc_amt 
WHERE 
     r.business_unit = 'DA-01-PERMATA' and r.Report_no='F 12.00' and r.asof_date='31-Mar-2017' 
+0

Vui lòng giúp tôi xin vui lòng – user8841680

+0

Nếu bạn có câu hỏi mới, hãy hỏi nó bằng cách nhấp vào nút [Hỏi câu hỏi] (https://stackoverflow.com/questions/ask). Bao gồm một liên kết đến câu hỏi này nếu nó giúp cung cấp ngữ cảnh. - [Từ đánh giá] (/ đánh giá/bài đăng chất lượng thấp/17753695) – Oleg

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