2009-08-18 7 views
10

J'ai une table mysql comme ci-dessous:MySQL, obtenir des utilisateurs classement

id  name  points 
1  john  4635 
3  tom  7364 
4  bob  234 
6  harry 9857 

Je veux essentiellement d'obtenir un rang utilisateur individuel sans sélectionner tous les utilisateurs. Je veux seulement sélectionner un seul utilisateur par identifiant et obtenir le classement des utilisateurs qui est déterminé par le nombre de points qu'ils ont.

Par exemple, Retournons tom avec le rang 2 sélection par l'identifiant 3.

Vive

Eef

Répondre

18
SELECT uo.*, 
     (
     SELECT COUNT(*) 
     FROM users ui 
     WHERE (ui.points, ui.id) >= (uo.points, uo.id) 
     ) AS rank 
FROM users uo 
WHERE id = @id 

rang Dense:

SELECT uo.*, 
     (
     SELECT COUNT(DISTINCT ui.points) 
     FROM users ui 
     WHERE ui.points >= uo.points 
     ) AS rank 
FROM users uo 
WHERE id = @id 
+0

Cheers mate, fonctionne parfaitement – RailsSon

+0

je l'aime. Un peu de réglage et cela correspond à mes besoins. Tnx pour le partage! –

+0

Problème mineur: S'il y a des liens, cela retournera le rang le plus élevé plutôt que le plus bas. Si vous voulez le plus bas, changez la condition à '>' et la valeur 'COUNT (*) + 1'. – Barmar

2

Solution par @ Quassnoi échouera en cas de liens. Voici la solution qui fonctionnera en cas de liens:

SELECT *, 
IF (@score=ui.points, @rank:[email protected], @rank:[email protected]+1) rank, 
@score:=ui.points score 
FROM users ui, 
(SELECT @score:=0, @rank:=0) r 
ORDER BY points DESC 
+0

Pour noter, le rang sera 0 si la première place a un score de 0. De plus, en cas d'égalité, le rang est incrémenté, pas ignoré par exemple. 10 - 1er, 9 - 2ème, 9 - 2ème, 6 - 3ème. En outre, la récupération des lignes doit être dans une sous-requête, car l'ordre est appliqué après les classements. – Sean

0
SET @rownum := 0; 
SELECT rank, score FROM (SELECT @rownum := @rownum +1 AS rank, `score` ,`user_id` 
FROM leaderboard 
ORDER BY `score` DESC , `updated_timestamp`) as result WHERE `user_id`=$user_id 
LIMIT 1 
Questions connexes