0

我想要完成的是 - 仅当高分优于当前分数时,才使用某些值更新表格。

得到了包含userIdhighScoresomethingdateLastPlayed列的表

userId为 1 的用户已经超过了自己的分数,在这种情况下,我想更新该行中的所有字段。如果他没有击败自己的高分,我只想更新dateLastPlayed字段。

到目前为止,这就是我插入东西的方式

INSERT INTO table VALUES ('$userId', '$highScore', '$something', '$dateLastPlayed') ON DUPLICATE KEY UPDATE highScore='$highScore', something='$something', dateLastPlayed='$dateLastPlayed'

请注意,userId 具有唯一键。

这很好用,但是每次都会更新highScoresomethingdateLastPlayed字段。我想更新字段highScore并且仅当变量 $ highScore大于数据库中当前设置的值时才更新。

我已经阅读了 MySQL 文档,但我不太明白。我怎样才能做到这一点?请注意,我可以使用多个查询和获取数据来执行此操作,然后使用该数据进行更多查询,但我觉得这根本不是要走的路,你们需要几秒钟才能想出一个绝妙的方法来解决问题。

非常感谢!

4

2 回答 2

1

如果您想在一个 SQL 中执行此操作,则类似于以下内容:

INSERT INTO table VALUES ('$userId', '$highScore', '$something', '$dateLastPlayed') 
ON DUPLICATE KEY 
UPDATE 
    highScore=
        case 
            when highScore >= $highScore then highScore
            else '$highScore'
        end,
    something=
        case 
            when highScore >= $highScore then something
            else '$something'
        end,
    dateLastPlayed ='$dateLastPlayed'

与多语句相比,这样做的缺点是业务逻辑在数据库/SQL 端。就个人而言,我更喜欢将业务逻辑保留在代码中,全部放在一个地方,以便以后维护。

于 2013-10-10T23:59:53.943 回答
0

在 WHERE 子句中添加条件:

update mytable set
highScore = $highScore,
something = $something
where userid = $userid
and highScore < $highScore -- only update if new high score exceeds existing
于 2013-10-10T23:59:37.950 回答