Игрок 1 завершил игру и набрал 10. Мы должны сохранять этот результат только в том случае, если он является максимальным для данного пользователя. Как я мог сделать это одним запросом? Я пробовал это:

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

Благодарность

0
user3127415 30 Май 2014 в 03:14

3 ответа

Лучший ответ

Ужасно то, что mysql не поддерживает вставку в значения с условием where, но вы можете обмануть, сделав следующее:

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

При этом строки не будут вставлены, если оценка выше 10, в противном случае будет создана строка с нужными вам значениями. Это также проще, чем спусковой крючок, и я считаю, что он также имеет более низкую стоимость.

0
Radu Vlad 30 Май 2014 в 00:00

Сделайте уникальный индекс на игрока. Затем сделайте инструкцию обновления вставки с функцией Max (). Это может помочь, если вы используете mysql.

Что-то вроде этого: Изменить таблицу рекордов добавить uniq key (player); Вставить в таблицу рекордов (игрок, оценка) значения (1,10) при повторном обновлении Оценка = макс (оценка, 10)

0
MichalSv 29 Май 2014 в 23:24
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;

(77 - это id, а 7 - это score.)

Это будет вставлено, если нет значений больше или равных 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: вставьте запись, если ее нет в таблице

0
Community 23 Май 2017 в 10:32