Игрок 1 завершил игру и набрал 10. Мы должны сохранять этот результат только в том случае, если он является максимальным для данного пользователя. Как я мог сделать это одним запросом? Я пробовал это:
INSERT INTO highscore("score", "player") values(10, 1)
WHERE (SELECT MAX(score) as hs FROM highscore WHERE player = 1) < 10;
Благодарность
3 ответа
Ужасно то, что mysql не поддерживает вставку в значения с условием where, но вы можете обмануть, сделав следующее:
INSERT INTO highscore (score, player)
SELECT 10, 1 FROM dual
WHERE (SELECT max(score) FROM highscore WHERE player = 1) < 10
При этом строки не будут вставлены, если оценка выше 10, в противном случае будет создана строка с нужными вам значениями. Это также проще, чем спусковой крючок, и я считаю, что он также имеет более низкую стоимость.
Сделайте уникальный индекс на игрока. Затем сделайте инструкцию обновления вставки с функцией Max (). Это может помочь, если вы используете mysql.
Что-то вроде этого: Изменить таблицу рекордов добавить uniq key (player); Вставить в таблицу рекордов (игрок, оценка) значения (1,10) при повторном обновлении Оценка = макс (оценка, 10)
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: вставьте запись, если ее нет в таблице
Похожие вопросы
Новые вопросы
mysql
MySQL — это бесплатная система управления реляционными базами данных (RDBMS) с открытым исходным кодом, которая использует язык структурированных запросов (SQL). НЕ ИСПОЛЬЗУЙТЕ этот тег для других БД, таких как SQL Server, SQLite и т. д. Это разные БД, которые используют свои собственные диалекты SQL для управления данными. В вопросе всегда указывайте точную версию сервера. Версии 5.x сильно отличаются по своим возможностям от версий 8+.
select 2, 20
-- это выбор 2 столбцов со значениями 2 и 20 соответственно. В вашем случаеselect 10, 1
будет эквивалентно, где первый столбец - это счет, а второй - игрок.