2013-02-21 54 views
5

我有一個工作表(結果),MySQL的更新具有以下結構(不要問,我沒有建立的話)與同桌SUM

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 

這是一個調查和調查提交後,正確答案的分數值發生了變化。我已經運行了更新以將「正確」答案的分數值設置爲10,現在我需要更新record_type:email的行總數,以便我們聯繫獲獎者。

的目標將是設置行1,5總列和9爲10,0和10

我在想這樣的事情

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

但是那並不是」看起來不錯,我擔心我可能會走錯路。

回答

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'; 

關於效率,在(record_type, user_id, score)指數會有助於有效地計算派生表,並與自聯接。

+0

這個工程。非常好。謝謝。 – byron 2013-02-21 23:28:54

+0

問題給你們......我在〜400K行的桌子上運行它,它正在崩潰(可能內存不足)。任何建議要解決?比如,一種以塊運行查詢的方法? – byron 2013-02-25 18:55:29

+0

這看起來很「複雜」,但實際上很容易實現,並且像夢一樣工作(您需要一個獨特的索引,我必須爲我的要求創建一個) – zzapper 2016-06-24 12:26:30

3

你快到了。

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'; 

這應該工作

+1

它不適用於MySQL服務器。 http://stackoverflow.com/questions/653826/update-with-sum-in-mysql – Kamil 2013-02-21 23:05:52

+1

它返回'錯誤代碼:1093.你不能指定目標表'r'在FROM子句中更新' – Kamil 2013-02-21 23:12:03

+0

哇,工作爲我的情況。那些說它不工作的人,你會改變它以適應你的情況! – 2017-06-02 20:39:05

-2

嗨我跟隨你的更新聲明,但Missing set key word錯誤發生。

以下是更新聲明。

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

請幫助我 – user8841680 2017-10-27 05:47:20

+0

如果您有新問題,請點擊[問問題](https://stackoverflow.com/questions/ask)按鈕。如果有助於提供上下文,請包含此問題的鏈接。 - [來自評論](/ review/low-quality-posts/17753695) – Oleg 2017-10-27 06:21:38