2010-12-06 16 views
3

Je crée un serveur de score élevé et l'une des fonctionnalités nécessaires est de pouvoir récupérer des scores élevés autour du score actuel des utilisateurs. J'ai actuellement les suivantes:Offset de limite négative dans mysql

SELECT * FROM highscores 
WHERE score >= (SELECT score FROM highscores WHERE userID = someID) 
ORDER BY score, updated ASC 
LIMIT -9, 19 

Le seul problème ici est que le paramètre de décalage de LIMIT ne peut pas être négatif, sinon je crois que cela fonctionnerait dandy. Donc, en conclusion, y a-t-il une astuce ou un moyen de compenser négativement le décalage LIMIT, ou y a-t-il un meilleur moyen d'y parvenir entièrement?

+0

Vous ne savez pas pourquoi vous devez utiliser un décalage négatif, pouvez-vous simplement passer de la commande ASC à DESC? – ajreal

+0

Ensuite, j'ai le même problème mais à l'autre bout. Disons que le joueur est classé 345 sur le tableau des leaders, le classement est implicite du score ORDER BY, mis à jour (en donnant la priorité aux scores les plus anciens). Nous avons ensuite besoin de récupérer les lignes 345-9 - 345 + 9, je n'arrive pas à trouver un moyen d'y parvenir par la clause LIMIT, car maintenant, peu importe comment je trier, je semble avoir besoin d'un décalage négatif. – Ylisar

Répondre

7

Vous pouvez faire une vraie douleur dans le cul seule requête de sélection, ou tout simplement faire:

(SELECT * FROM highscores 
WHERE score <= (SELECT score FROM highscores WHERE userID = someID) 
ORDER BY score, updated ASC 
LIMIT 9) 
UNION 
(SELECT * FROM highscores 
WHERE score = (SELECT score FROM highscores WHERE userID = someID)) 
UNION 
(SELECT * FROM highscores 
WHERE score >= (SELECT score FROM highscores WHERE userID = someID) 
ORDER BY score, updated ASC 
LIMIT 9) 

j'ai jeté dans une pièce à saisir le score de l'utilisateur indiqué il est au milieu de la liste. Facultatif si vous en avez besoin. En outre, n'utilisez pas SELECT *, utilisez des champs spécifiques. La clarté est toujours préférable et la performance sage *.

+0

union tous avec < and > opérateurs serait mieux. :-) –

+0

Cela me met sur la piste mais j'ai le problème suivant: disons que j'ai 100 scores et j'essaie d'obtenir les 9 scores de chaque côté du 50e meilleur score. Donc je veux des scores 40-60. Ce code ci-dessus renvoie 1-10 et 50-60. Aidez-moi? – themerlinproject

+0

@themerlinproject utiliser ORDER BY score DESC, ASC mis à jour dans la première instruction – SiXoS