我有一个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
Run Code Online (Sandbox Code Playgroud)
我需要更新表格,以便:
所有gameId 2分数都被添加到gameId 1,其中id和flag是相同的.(例如,通过添加第1行和第4行的分数,第1行的得分为20)
如果发生上述情况,则需要删除gameId 2行.
如果没有找到上面的内容(例如,有一行gameId为2,但id和flag与另一行不匹配),则gameId可以改为1.
因此SQL完成后我的表应如下所示:
id | gameId | score | flag
--------------------------
1 | 1 | 20 | 1
1 | 1 | 20 | 0
2 | 1 | 1 | 0
3 | 1 | 1 | 0
Run Code Online (Sandbox Code Playgroud)
我怎么能在SQL中写这个?谢谢 :)
认为这会起作用:
试试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;
Run Code Online (Sandbox Code Playgroud)
试试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;
Run Code Online (Sandbox Code Playgroud)