2010-07-08 5 views
0

J'ai une table contenant les scores de mon jeuComment supprimer la dernière ligne d'une requête

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

et je voudrais toujours limiter le nombre d'entrées de score à 10 éléments (pour un niveau spécifique, et difficulté)

Donc quand la table de score a 10 entrées (pour un niveau et une difficulté spécifiques) et que le joueur a un nouveau meilleur score, je voudrais supprimer le dernier élément (le score le plus bas), et insérer le nouveau score élevé. Comment puis-je faire ceci?

+0

Quelle base de données utilisez-vous? MySQL? – Andomar

+1

Pourquoi ne pas simplement stocker tous les scores, et sélectionnez le top 10? Sinon, les déclencheurs devraient faire le travail – BenW

+0

J'utilise SQLite – penpen

Répondre

2

Que diriez-vous ...

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); 

bien que cela ne fonctionnera pas sur chaque base de données. Si aussi, la table ne sera pas limitée à dix rangées si plus d'une partition est de niveau à la dixième position.

Plus tard - éditer pour corriger l'erreur signalée par Andomar.

+2

La sous-requête ne sélectionne que les agrégats, donc elle retournera exactement une ligne.La 'limite 10' n'a aucun effet – Andomar

+0

D'accord, vous avez raison, je vais l'éditer et corriger. –

+0

merci, ça marche!: D – penpen

0
DELETE FROM Scores 
WHERE LevelID = ? AND Difficulty = ? 
ORDER BY Score ASC 
LIMIT 1 

doit supprimer le score le plus bas. Mais même si c'est ce que vous voulez, ce n'est peut-être pas ce dont vous avez besoin. :)

+0

ça semble bien, mais pourquoi dites-vous que ce n'est peut-être pas ce que je Je le vérifie et vous dit si cela fonctionne – penpen

+0

c'est une erreur de syntaxe avec sqlite :( "Erreur SQL: près de" ORDER ": erreur de syntaxe" – penpen

+0

Pourrait être.J'ai écrit avec MySQL à l'esprit.Mais tout va bien qui se termine @Cooper: +1 – Amadan

0
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) 

vous pouvez remplacer playername + '|' + cast (levelID varchar) + '|' + cast (difficulté varchar) + '|' + cast (score varchar) avec votre clé primaire

Cela vous donnera les joueurs au 10e et au-delà des lieux:

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 

Résultat:

bRank    playerName           LevelID  Score  Difficulty 
-------------------- -------------------------------------------------- ----------- ----------- ----------- 
10     Player 3           1   3   10 
11     Player 2           1   2   10 
12     Player 1           1   1   10 
Questions connexes