我接受了userId,leaderboardId和Score,并且如果该用户没有该排行榜的分数则需要插入,或者如果它具有分数并且新分数较大则需要更新。
我的问题是完成上述操作所需的SQL语句是什么。
我查看了插入和复制,但这似乎只适用于唯一键,在此示例中,只要它们位于不同的排行榜中,就可以有多个相同的userId,反之亦然。
由于
解决! 编辑:
感谢大家,这就是我做的工作!
UNIQUE KEY 'newKey' (userId, leaderboardId)
insert into score (UserId, LeaderboardId, Score) values(1,5,100)
ON DUPLICATE KEY UPDATE score = greatest(Score, values(Score))
答案 0 :(得分:1)
这是我的其他答案之一的剪切和粘贴,我会根据你的类别调整它,但在此之前坚持:
CREATE TABLE leaderBoard
( id int AUTO_INCREMENT primary key,
userID int not null,
leaderBoardID int not null,
score int not null,
UNIQUE KEY `combo_thingie1` (userID,leaderBoardID) -- unique composite
) ENGINE=InnoDB auto_increment=150;
insert leaderBoard (userID,leaderBoardID,score) values (113,1,0)
on duplicate key update score=greatest(0,score);
insert leaderBoard (userID,leaderBoardID,score) values (113,2,0)
on duplicate key update score=greatest(0,score);
select * from leaderBoard;
+----+--------+---------------+-------+
| id | userID | leaderBoardID | score |
+----+--------+---------------+-------+
| 1 | 113 | 1 | 0 |
| 2 | 113 | 2 | 0 |
+----+--------+---------------+-------+
insert leaderBoard (userID,leaderBoardID,score) values (113,2,555)
on duplicate key update score=greatest(555,score);
select * from leaderBoard;
+----+--------+---------------+-------+
| id | userID | leaderBoardID | score |
+----+--------+---------------+-------+
| 1 | 113 | 1 | 0 |
| 2 | 113 | 2 | 555 |
+----+--------+---------------+-------+
insert leaderBoard (userID,leaderBoardID,score) values (113,2,444)
on duplicate key update score=greatest(444,score); -- ignores lower score
select * from leaderBoard;
+----+--------+---------------+-------+
| id | userID | leaderBoardID | score |
+----+--------+---------------+-------+
| 1 | 113 | 1 | 0 |
| 2 | 113 | 2 | 555 |
+----+--------+---------------+-------+
答案 1 :(得分:1)
尝试这个,如果你得到null结果(=没有行):
select score from table
where userid = 42
and leaderboardId = 2001
and score is not null;
然后没有分数,你可以插入你的数据。 否则,您必须检查,如果您的新分数大于结果值,则可以更新。 否则你无事可做。