仅在新值最高时插入

时间:2014-05-29 23:14:04

标签: mysql

玩家1已完成游戏并获得10分。只有当该分数为该用户的高分时才应保存此分数。我怎么能在一个查询中完成这个? 我试过这个:

INSERT INTO highscore("score", "player") values(10, 1)
WHERE (SELECT MAX(score) as hs FROM highscore WHERE player = 1) < 10;

由于

3 个答案:

答案 0 :(得分:0)

在玩家身上制作uniq索引。然后使用Max()函数生成insert update语句。如果您使用的是mysql,这可以提供帮助。

这样的事情: 改变表高分添加uniq键(播放器); 插入高分(球员,得分)值(1,10) 重复更新 分数=最大(分数,10)

答案 1 :(得分:0)

丑陋的是,mysql不支持insert where where where condition,但是你可以通过这样做来欺骗:

INSERT INTO highscore (score, player)
SELECT 10, 1 FROM dual
WHERE (SELECT max(score) FROM highscore WHERE player = 1) < 10

如果分数高于10,则不会插入任何行,否则将创建一个包含所需值的行。它比触发器更容易,我相信它也有更低的成本。

答案 2 :(得分:0)

INSERT INTO `max_score` 
  SELECT 77, 7 FROM `max_score` WHERE NOT EXISTS 
  (SELECT * FROM `max_score` WHERE id = 77 AND score >= 7) LIMIT 1;

77id7score。)

如果没有大于或等于7的值且id等于77,则会插入,如果值大于7,则不会插入。

准备好的陈述和时间戳:

<?php

$id = 77;
$score = 13;

$date = new DateTime();
$timestamp = $date->format('Y-m-d H:i:s');

$sql = <<<EOT

INSERT INTO `max_score` 
  SELECT ?, ?, ? FROM `max_score` WHERE NOT EXISTS 
  (SELECT * FROM `max_score` WHERE id = ? AND score >= ?) LIMIT 1;

EOT;

$stmt = $mysqli->prepare($sql);
$stmt->bind_param('iisii', $id, $score, $timestamp, $id, $score);
$stmt->execute();

?>

(一个警告:表max_score必须至少有一条记录,SELECT ?, ? FROM max_score`才能返回提供的值。)

灵感来自:MySQL: Insert record if not exists in table