SQL, ограничивая общее количество строк, удаляя строку с наименьшим значением - PullRequest
0 голосов
/ 13 января 2012

Я пытаюсь создать список рекордов в базе данных MySQL, всего 3 столбца: идентификатор, имя и счет.Таблица называется Рекорды.Я пытался использовать этот код:

DELETE FROM Highscores WHERE
Score = (SELECT min(Score) FROM Highscores)
AND (SELECT count(*) FROM Highscores) > 10;

Но выдает эту ошибку:

#1093 - You can't specify target table 'Highscores' for update in FROM clause

Как удалить строку с наименьшим значением, только если в нем более 10 строк?Возможно, может быть несколько строк с наименьшим значением, но я хочу удалить только одну.

Ответы [ 4 ]

1 голос
/ 13 января 2012

Интересно, не могли бы вы просто создать представление с высокими показателями?

0 голосов
/ 13 января 2012
delete from highscores where id = (select * from (
select id from highscores order by score desc limit 10,1) as t)

Еще один способ сохранить только 10 лучших результатов

delete from highscores where id in (select * from (
select id from highscores order by score desc limit 10,18446744073709551615) as t)
0 голосов
/ 13 января 2012

Попробуйте создать временную таблицу и использовать ее в своих вызовах SELECT.

0 голосов
/ 13 января 2012

Использовать хранимую процедуру:

Это выполняется только один раз

DELIMITER $$

DROP PROCEDURE IF EXISTS `Sanitize_Highscores`$$
CREATE PROCEDURE `Sanitize_Highscores`() READS SQL DATA
BEGIN
  DECLARE numrows int DEFAULT 0;
  SELECT COUNT(*) INTO numrows FROM Highscores;
  if numrows>10 THEN
    DELETE FROM Highscores ORDER BY Score LIMIT 1;
  END IF;
END$$

DELIMITER ;

и это заменяет ваш запрос

CALL Sanitize_Highscores
...