4

私は4列のテーブルを持っていますが、主キーはid、gameId、flagの複合です。

id | gameId | score | flag
--------------------------
1  | 1      | 10    | 1
1  | 1      | 20    | 0
2  | 1      | 1     | 0
1  | 2      | 10    | 1
3  | 2      | 1     | 0

次のようにテーブルを更新する必要があります。

  • すべてのgameId2スコアは、idとフラグが同じであるgameId1に追加されます。(たとえば、行1と行4のスコアを加算すると、行1のスコアは20になります)

  • 上記が発生した場合は、gameId2行を削除する必要があります。

  • 上記が見つからない場合(たとえば、gameIdが2であるが、idとフラグが別の行と一致しない行がある場合)、gameIdを1に変更することができます。

したがって、SQLが完了した後の私のテーブルは次のようになります。

id | gameId | score | flag
--------------------------
1  | 1      | 20    | 1
1  | 1      | 20    | 0
2  | 1      | 1     | 0
3  | 1      | 1     | 0

これをSQLで書くにはどうすればよいですか?ありがとう :)

4

1 に答える 1

6

これがうまくいくと思います:

1を試す

UPDATE score_list AS t2
LEFT JOIN score_list AS t1 ON
  (t1.id = t2.id AND t1.flag = t2.flag AND t1.gameId = 1)
SET
  t1.score = t1.score + t2.score,
  t2.gameId = IF(t1.gameId IS NULL, 1, t2.gameId)
WHERE t2.gameId = 2;

DELETE FROM score_list WHERE gameId = 2;

2を試す

# add scores to gameId = 1
UPDATE score_list AS t2
LEFT JOIN score_list AS t1 ON
  (t1.id = t2.id AND t1.flag = t2.flag AND t1.gameId = 1)
SET
  t1.score = t1.score + t2.score
WHERE t2.gameId = 2;

# try to move gameID 2 to gameId 1, using ignore to allow rows to fail, as gameId alredy exists
UPDATE IGNORE score_list SET gameId = 1 WHERE gameId = 2;

# delete all not updated rows from last query
DELETE FROM score_list WHERE gameId = 2;
于 2012-07-11T16:24:36.517 に答える