Игрок 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
Я это уже читал. Однако я не знаю, для чего это «выберите 2, 20»?
 – 
user3127415
30 Май 2014 в 03:17
select 2, 20 -- это выбор 2 столбцов со значениями 2 и 20 соответственно. В вашем случае select 10, 1 будет эквивалентно, где первый столбец - это счет, а второй - игрок.
 – 
sgeddes
30 Май 2014 в 03:37

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 в 04:00

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

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

0
MichalSv 30 Май 2014 в 03:24
Но это заменяет последний высокий балл. Я хочу иметь историю рекордов. Я работаю над решением с функцией триггера перед вставкой. Это может сработать.
 – 
user3127415
30 Май 2014 в 03:34
1. зачем вам это нужно на одном запросе? 2. почему бы вам не создать процедуру вместо триггера?
 – 
Radu Vlad
30 Май 2014 в 03:37
Триггер — это решение. Будьте осторожны, если вы используете репликацию.
 – 
MichalSv
30 Май 2014 в 03:39
1. Чтобы снизить затраты. 2. Я не могу использовать процедуру, потому что хостинг-провайдер не разрешает.
 – 
user3127415
30 Май 2014 в 03:42
Вставьте в рекорд (игрок, счет) значения (1,10) при дублирующем обновлении. Но в одиночном запросе это действительно сложно или глупо :-)
 – 
MichalSv
30 Май 2014 в 03:46
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 в 13:32