首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果列值大于上一列,则MySQL更新;如果列值不存在,则插入

如果列值大于上一列,则MySQL更新;如果列值不存在,则插入
EN

Stack Overflow用户
提问于 2015-08-30 13:48:02
回答 2查看 977关注 0票数 0

我接受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))

EN

回答 2

Stack Overflow用户

发布于 2015-08-30 14:00:53

这是从我的另一个答案中剪切并粘贴的,我会根据你的分类进行调整,但在此之前请耐心等待:

模式:

代码语言:javascript
复制
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;

测试:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2015-08-30 14:02:57

如果结果为空(=无行),请尝试此操作:

代码语言:javascript
复制
select score from table
where userid = 42
and leaderboardId = 2001
and score is not null;

然后就没有分数了,你可以插入你的数据。否则你必须检查,如果你的新分数大于你的结果值,那么你可以更新。否则你什么也做不了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32293615

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档