如果列值大于previous,则为MySQL Update;如果不存在,则为insert

时间:2015-08-30 05:48:02

标签: php mysql

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

2 个答案:

答案 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;

然后没有分数,你可以插入你的数据。 否则,您必须检查,如果您的新分数大于结果值,则可以更新。 否则你无事可做。