我接受userId、leaderboardId和Score,如果用户没有该排行榜的分数,则需要插入;如果排行榜有分数,并且新的分数更大,则需要更新。
我的问题是,完成上述任务所需的SQL语句是什么。
我已经研究了insert和on duplicate,但这似乎只适用于唯一键,在这个例子中,可以有多个相同的userIds,只要它们在不同的排行榜中,反之亦然。
谢谢
解决了!编辑:
感谢这里的每一个人,这是我为它所做的!
UNIQUE KEY 'newKey' (userId, leaderboardId)
insert into score (UserId, LeaderboardId, Score) values(1,5,100) ON DUPLICATE KEY UPDATE score = greatest(Score, values(Score))
发布于 2015-08-30 14:00:53
这是从我的另一个答案中剪切并粘贴的,我会根据你的分类进行调整,但在此之前请耐心等待:
模式:
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 |
+----+--------+---------------+-------+发布于 2015-08-30 14:02:57
如果结果为空(=无行),请尝试此操作:
select score from table
where userid = 42
and leaderboardId = 2001
and score is not null;然后就没有分数了,你可以插入你的数据。否则你必须检查,如果你的新分数大于你的结果值,那么你可以更新。否则你什么也做不了。
https://stackoverflow.com/questions/32293615
复制相似问题