Как удалить последнюю строку запроса - PullRequest
0 голосов
/ 08 июля 2010

У меня есть таблица, содержащая оценки моей игры

CREATE TABLE Scores
(
  PlayerName varchar(50),
  LevelId integer,
  Score integer,
  Difficulty integer
);

, и я хотел бы всегда ограничивать количество записей оценки 10 элементами (для определенного уровня и сложности)

Поэтому, когда в таблице результатов 10 записей (для определенного уровня и уровня сложности), а у игрока новый рекорд, я хотел бы удалить последний элемент (наименьший показатель) и вставить новый рекорд.Как я могу это сделать?

Ответы [ 3 ]

2 голосов
/ 08 июля 2010

Как насчет ...

DELETE FROM Scores S1
    WHERE Score < (SELECT MIN(Score)
                       FROM (SELECT Score
                                 FROM Scores S2
                                 WHERE S1.Level      = S2.Level      AND
                                       S1.Difficulty = S2.Difficulty
                                 ORDER BY Score DESC
                                 LIMIT 10) AS Derived);

хотя это не будет работать на каждой базе данных. Если также не ограничит таблицу десятью строками, если на десятой позиции находится более одного счета.

Позже - отредактируйте, чтобы исправить ошибку, указанную Андомаром.

0 голосов
/ 08 июля 2010
delete from Scores 
where playerName+'|'+cast(levelID as varchar)+'|'+cast(Difficulty as varchar)+'|'+cast(score as varchar) 
in( 
select playerName+'|'+cast(levelID as varchar)+'|'+cast(Difficulty as varchar)+'|'+cast(score as varchar)  from 
(Select rank() over (partition by cast(levelID as varchar)+'|'+cast(Difficulty as varchar) order by score desc) as bRank,* 
from Scores as b) as Ranks
where Ranks.bRank >= 10)

вы можете заменить playerName + '|' + cast (levelID как varchar) + '|' + cast (Трудность как varchar) + '|' + cast (оценка как varchar) вашим первичным ключом

Это даст вам игроков в 10-м и более местах:

select Ranks.* from 
(Select rank() over (partition by cast(levelID as varchar)+'|'+cast(Difficulty as varchar) 
order by score desc) as bRank,* 
from Scores as b) as Ranks
where Ranks.bRank >= 10 

Результат:

bRank                playerName                                         LevelID     Score       Difficulty
-------------------- -------------------------------------------------- ----------- ----------- -----------
10                   Player 3                                           1           3           10
11                   Player 2                                           1           2           10
12                   Player 1                                           1           1           10
0 голосов
/ 08 июля 2010
DELETE FROM Scores
WHERE LevelID = ? AND Difficulty = ?
ORDER BY Score ASC
LIMIT 1

следует удалить самый низкий балл. Но даже если это то, что вы хотите, это может быть не то, что вам нужно. :)

...