6

私は次の構造を持つテーブル(結果)を使用しています(質問しないでください、私はそれを作成しませんでした)

id | record_type | user_id | answer_id | choice | score | total |    email
-------------------------------------------------------------------------------
1    email         xxxxxxx                                  0     userX@site.com
2    answer        xxxxxxx    aaaaaa       A       0
3    answer        xxxxxxx    bbbbbb       A       0
4    answer        xxxxxxx    cccccc       B       10
5    email         yyyyyyy                                  0     userY@site.com
6    answer        yyyyyyy    aaaaaa       A       0
7    answer        yyyyyyy    bbbbbb       A       0
8    answer        yyyyyyy    cccccc       A       0
9    email         zzzzzzz                                  0     userZ@site.com
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

しかし、それは正しくないように見え、私は間違った道を進んでいるのではないかと心配しています。

4

2 に答える 2

11
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)すると、派生テーブルの効率的な計算と自己結合の両方に役立ちます。

于 2013-02-21T23:23:54.520 に答える
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';

これはうまくいくはずです

于 2013-02-21T22:46:22.453 に答える