使用同一张表中的值更新MySQL表

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

我需要更新表格,以便:
  • 将所有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

我该如何用SQL语言来编写这段代码? 谢谢 :)


你的结果中的ID是否应该是重复的? - Mike Mackintosh
是的,因为主键是由id、gameId和flag构建的,所以即使id字段被复制,也没有关系。 - David Normington
1个回答

6

think this going to work:

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

感谢您的快速回复!但是我遇到了这个错误: Mysqli语句执行错误:由于表同时作为“t2”和“t1”更新,因此不允许更新主键/分区键。 - David Normington
你的回答启发了我解决一个相关问题的方法。谢谢! - dafero

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接