2016-11-02 1 views
1

J'essaie de faire une requête et j'ai déjà recherché une réponse sur stackof mais je n'en ai pas trouvé de correspondant à mes besoins. J'ai une table nommée player dans laquelle il y a deux colonnes, "pseudo" et "score". J'utilise cette requête pour obtenir les 5 meilleurs joueurs:Sélectionnez le classement d'une requête sql de lecteur spécifique

SELECT nickname, score 
FROM player 
ORDER BY score DESC LIMIT 5; 

et moi avons eu ce que la réponse:

nickname - score:  
zod  - 30 
ciao  - 20 
jiji  - 20 
mayina - 20  
jon  - 0. 

Maintenant, je voudrais avoir le rang d'un seul joueur, nous allons dites "jiji" et obtenez 3 en conséquence, parce que c'est le troisième résultat de la liste.

J'ai essayé beaucoup de questions comme

SELECT COUNT(*) AS rank 
FROM player 
WHERE score >= (SELECT score FROM player WHERE nickname = 'jiji') 

mais ils reviennent toujours 4 pour « Jiji » ou « ciao », qui est le rang du dernier joueur qui obtient 20 le score dans ce tableau.

Comment puis-je avoir 3 pour "jiji" à la place? Merci beaucoup.

+0

Soyez prudent lorsque vous étiquetez vos questions. C'est clairement mysql et pas sql-server. Ce ne sont pas les mêmes choses. –

+0

Vous devez utiliser la fonction analytique pour résoudre votre problème – Teja

+0

regardez ici: http://stackoverflow.com/questions/2520357/mysql-get-row-number-on-select – Galz

Répondre

1

En utilisant les définitions couramment utilisées, le rang pour jiji serait:

SELECT count(*) + 1 AS rank 
FROM player 
WHERE score > (SELECT score FROM player WHERE nickname = 'jiji'); 

Ce retour " 2 ", parce qu'il y a des liens lorsque score = 30.

Si vous souhaitez que le rang soit stable et différent pour chaque ligne, vous avez besoin d'une clé supplémentaire. Une clé évidente (dans ce cas) est nickname:

SELECT count(*) AS rank 
FROM player p CROSS JOIN 
    (SELECT score FROM player WHERE nickname = 'jiji') s 
WHERE p.score > s.score or 
     (p.score = s.score and p.nickname <= 'jiji'); 
+0

Ceci est en fait ce que j'essayais de faire (merci) mais je viens de remarquer que phpmyadmin ne commande pas aussi par ordre alphabétique de la clé (surnom) Alors .. Comment puis-je obtenir ce 'SELECT surnom, score FROM joueur ORDER BY score DESC LIMIT 5' requête pour aussi ordonner par le surnom ordre alphabétique? J'ai essayé quelque chose, mais rien n'a fonctionné. (Je suis un peu confus parce que ça fait des heures que j'essaie de surmonter ça, désolé ..) –

3

Essayez ceci:

SET @rank=0; 
SELECT * 
FROM (SELECT @rank:[email protected]+1, nickname, score 
    FROM player 
    ORDER BY score 
    DESC) AS t 
WHERE t.nickname = 'jiji'; 

commentaire correct sur ce ne pas être stable en cas d'égalité de score. Pour le rendre stable, nous pouvons changer le tri à base sur le score puis surnom:

SELECT * 
FROM (SELECT @rank:[email protected]+1, nickname, score 
    FROM player 
    ORDER BY score, nickname 
    DESC) AS t 
WHERE t.nickname = 'jiji'; 
+0

Je viens de trouver la même requête avant de vérifier ici encore et cela fonctionne (merci!) Mais maintenant que je l'utilise sur php, je dois faire deux requêtes distinctes, une pour le ' set @ rank = 0' et l'autre pour le reste. Et en essayant de le faire avec la deuxième requête, il me dit: "Erreur, la colonne inconnue 'rank' dans 'liste des champs' –

+0

Le code que j'utilise: ' $ querysetRank = "set @rank = 0"; if ($ resultat = mysqli_query ($ base de donnees, $ querysetRank)) { $ queryPlayerRank = "CHOISIR rank FROM (SELECT @rank: = rank + 1 comme rang, pseudo FROM ordre du joueur par score desc) comme pl où pl.nickname = '$ surnom' "; si // erreur autre // faire things' –

+0

@JulsA Je pense que vous devez vous assurer exécuter les requêtes (($ RESULTZ = mysqli_query (base de données $, queryPlayerRank $))!) à partir de la même session, "@ rank" est disponible dans la deuxième requête. – Galz