Обновление или вставка лучших результатов в SQL - PullRequest
1 голос
/ 27 ноября 2011

Последние несколько дней я ломал голову над этим, и я не уверен, что это возможно, но решил спросить здесь.

Возможно ли для одного оператора SQL обновить высокий балл, если ваш балл выше, или вставить его, если ваш первый балл?

В таблице My Score есть столбцы UserID, Level и Score, и мне нравится следовать следующей логике:

  • Если ваш новый балл больше, чем ваш последний балл для этого уровня, замените его.
  • Если у вас нет очков для этого уровня, то добавьте его.
  • Если ваш балл за этот уровень меньше, чем ваш наивысший балл за этот уровень, ничего не делайте.

Возможно ли это в одном операторе SQL, или мне нужно использовать два, один, чтобы узнать, есть ли у вас новый высокий балл, и если да, заменить его? Каждый идентификатор пользователя будет иметь только одну оценку в таблице для каждого уровня.

Я использую MySQL.

UPDATE:

Основываясь на ответе ниже, этот следующий SQL работал:

INSERT INTO Scores SET UserID = 'user', Level = 'level', Score = 'score'
    ON DUPLICATE KEY UPDATE Score = IF (Score < 'score', 'score', Score)  

Моя таблица определена так, что UserID и Level являются ключами.

Ответы [ 2 ]

1 голос
/ 27 ноября 2011

Вы захотите использовать: INSERT ... ON DUPLICATE KEY UPDATE синтаксис для этого

Этот сайт показывает использование операторов IF вместо WHERE, чтобы выполнить только обновление балла, если оно выше.

INSERT INTO Scores
SET UserID = 'user'
   , Level = 'level'
   , Score = 'score'
ON DUPLICATE KEY UPDATE
   Score = IF (Score < 'score', 'score', Score)
0 голосов
/ 27 ноября 2011

Вам нужно два утверждения, извините.Некоторые люди собираются предложить REPLACE INTO, но это не решит вашу проблему, потому что REPLACE INTO удалит строку перед ее добавлением (если она существует).Таким образом, вы потеряете первоначальный счет.Вы не сможете увеличить счет, используя REPLACE INTO.

Редактировать: То есть, если у вас еще нет счета в памяти.Но я не рекомендую делать инкрементные операции, выбирая данные в память приложения, увеличивая их, затем обновляя таблицу, потому что вы можете непреднамеренно вызвать состояние гонки таким образом.

Правка # 2: На самом деле пареньвыше меня просто связано с какой-то функциональностью, о которой я не знал.Если вы используете уникальные ключи, это будет работать для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...