2013-02-21 16 views
5

私は次のような構造を持つテーブル(結果)で働いている(私はそれを構築していない、聞かないでください)のMySQL同じテーブル内のSUMとUPDATE

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で行の合計を更新する必要があります。

目標は、10,0と10

私はこの

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

のようなものと思っていますしかし、それは」doesnのように行1,5および9の合計列を設定することです私は間違った道を歩いているかもしれないと心配しています。

答えて

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

+0

あなたのための質問...私は〜400Kの行を持つテーブル上でこれを実行していると(おそらくメモリが不足している)クラッシュしています。解決するための提案はありますか?同様に、クエリをチャンクで実行する方法は? – byron

+0

これは "複雑"に見えるかもしれませんが、実装するのは実際に簡単で、夢のように機能します(ユニークなインデックスが必要です。私の要件に合わせて作成しなければなりませんでした) – zzapper

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

+1

'Error Code:1093を返します。FROM句で更新対象テーブル 'r'を指定することはできません。 – Kamil

+0

Wow、worked私の場合はそれが働いていないと言った人は、ちょうどあなたのケースに合わせてそれを変更してください! –

-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

+0

新しい質問がある場合は、[質問する](https://stackoverflow.com/questions/ask)ボタンをクリックしてください。コンテキストを提供する場合は、この質問へのリンクを含めてください。 - [レビューの投稿](/レビュー/低品質の投稿/ 17753695) – Oleg

関連する問題