2010-03-19 6 views
0

Plus tôt, j'ai demandé this question, qui a essentiellement demandé comment lister 10 gagnants dans une table avec de nombreux gagnants, selon leurs points.MySQL: SELECT un gagnant, retournant leur rang

Cela a été répondu.

Maintenant, je cherche à trouver un gagnant X dans la table, et savoir ce que position il est, quand la table est classée par points.

Par exemple, si tel est le tableau:

 Winners: 
NAME:____|__POINTS: 
Winner1 | 1241 
Winner2 | 1199 
Sally | 1000 
Winner4 | 900 
Winner5 | 889 
Winner6 | 700 
Winner7 | 667 
Jacob | 623 
Winner9 | 622 
Winner10 | 605 
Winner11 | 600 
Winner12 | 586 
Thomas | 455 
Pamela | 434 
Winner15 | 411 
Winner16 | 410 

Ce sont les entrées et les sorties possibles pour ce que je veux faire:

Query: "Sally", "Winner12", "Pamela", "Jacob" 
Output: 3  12   14  623 

Comment puis-je faire cela? Est-ce possible, en utilisant seulement une déclaration MySQL? Ou ai-je besoin de PHP aussi?

C'est le genre de chose que je veux:

WHEREIS FROM Winners WHERE Name='Sally' LIMIT 1 

Idées? Éditer - NOTE: Vous n'avez pas à faire face à la situation où deux Gagnants ont les mêmes Points (supposons pour simplifier que cela n'arrive pas).

Répondre

4

Je pense que cela vous donnera le résultat souhaité. Notez que je gère correctement les cas où le gagnant ciblé est à égalité de points avec un autre gagnant. (Les deux obtiennent la même position).

SELECT COUNT(*) + 1 AS Position 
FROM myTable 
WHERE Points > (SELECT Points FROM myTable WHERE Winner = 'Sally') 

Modifier:
Je voudrais "bouchon" Ignacio Vazquez-Abrams réponse qui, à plusieurs égards, est mieux que ce qui précède.
Par exemple, il permet de lister tous (ou plusieurs) gagnants et leur position actuelle.
Un autre avantage est qu'il permet d'exprimer une condition plus compliquée pour indiquer qu'un joueur donné est en avance sur un autre (voir ci-dessous). Lire le commentaire incrediman à l'effet qu'il n'y aura pas de «liens» m'a incité à me pencher là-dessus; la requête peut être légèrement modifiée comme suit pour gérer la situation lorsque les joueurs ont le même nombre de points (ces joueurs auraient auparavant reçu la même valeur de Position, maintenant la valeur de position est liée à leurs valeurs de départ relatives).

SELECT w1.name, (
    SELECT COUNT(*) 
    FROM winners AS w2 
    WHERE (w2.points > w1.points) 
    OR (W2.points = W1.points AND W2.Start < W1.Start) -- Extra cond. to avoid ties. 
)+1 AS rank 
FROM winners AS w1 
-- WHERE W1.name = 'Sally' -- optional where clause 
+3

Je pense que vous voulez dire 'Où Points> ...' –

+0

(1) En fait, il n'y aura jamais deux gagnants avec la même position, car ils sont d'abord commandés par des points, puis Démarrer et Start est UNIQUE. Ma requête select 10 ressemble à ceci, par exemple: 'SELECT * FROM Winners ORDER BY Points DESC, Start ASC' – Cam

+0

L'a étudié un peu plus, et l'ai essayé. Cela fonctionne très bien; Merci! – Cam

2
SELECT w1.name, (
    SELECT COUNT(*) 
    FROM winners AS w2 
    WHERE w2.points > w1.points 
)+1 AS rank 
FROM winners AS w1