2015-09-10 4 views
0

У меня есть таблица игр, в которой содержатся столбцы ID, Name, Score, Time. Всего в таблице содержится 10 строк, в которых хранится 10 лучших записей игры. Моя программа, когда пользователь имеет возможности ввести 10 сверху, строку с максимальным (временем) будет удалена:SQL выбирает только одну строку, когда есть два max (XXX)

delete from game where time = (select x.del_time from (select max(time) as del_time from game) x)" 

Однако, при наличии более чем 1 строки с одинаковыми максами (время), он будет удалите обе строки. Мой вопрос: как удалить только 1 строку? Точно так же, как если максимальное время будет одинаковым, получите максимальный балл, и если максимальный балл будет одинаковым, получите максимальный ID (поскольку идентификатор является автоматическим приращением, это будет не то же самое). Спасибо!!

+0

Попробуйте использовать «LIMIT 1» в конце запроса – liding

+0

Также обратите внимание, что ваш исходный запрос может быть выполнен с одним подзапросом и без наложения псевдонимов, что упростит его: 'удалить из игры, где time = (select max (время) из игры) '. –

+0

@EdGibbs Он показывает ошибку "# 1093 - Вы не можете указать целевую таблицу" игра "для обновления в разделе FROM" в любом случае спасибо! –

ответ

0

Вы должны удалить, ID:

DELETE FROM game 
WHERE id = (SELECT id 
      FROM (
       SELECT id 
       FROM game 
       WHERE `time` = (SELECT MAX(`time`) FROM game) 
       ORDER BY score DESC, id DESC 
       LIMIT 1) AS x) 

Этот запрос будет удален из записи, имеющий максимальное значение time. Если есть несколько таких строк, то он будет выбирать значение, имеющее максимальное значение score. В случае связи score, он выберет значение, имеющее максимальное значение id.

Demo here

+0

Действительно спасибо! Это именно то, что я хочу! –

0
delete from game where time = (select x.del_time from (select max(time) as del_time from game LIMIT 1) x)" 
+0

У вас есть 'LIMIT 1' в' select max (time) ... 'query, который возвращает только одну строку. –

+0

LIMIT 1 следует положить в конец. удалить из игры, где time = (выберите x.del_time from (выберите max (время) как del_time из игры) x) LIMIT 1 –

0
delete from game where time = (select x.del_time from (select max(time) as del_time from game LIMIT 1) x) " 
0

просто удалить его с помощью limit 1 в конце запроса или id.