2009-08-18 11 views
10

Tengo una tabla de MySQL, como a continuación:MySQL, conseguir que los usuarios clasificar

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

básicamente quiero conseguir un rango usuario individual sin seleccionar todos los usuarios. Solo quiero seleccionar un único usuario por ID y obtener el rango de usuarios que está determinado por la cantidad de puntos que tienen.

Por ejemplo, volvamos a Tom con la selección de rango 2 por el ID 3.

Saludos

Eef

Respuesta

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 

rango denso:

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

Saludos compañero, funciona perfectamente – RailsSon

+0

me encanta. Un poco de ajuste y se ajusta a mis necesidades. ¡Tnx para compartir! –

+0

Problema menor: si hay vínculos, esto devolverá el rango más alto en lugar del más bajo. Si desea la más baja, cambie la condición a '>' y el valor a 'COUNT (*) + 1'. – Barmar

2

solución por @ Quassnoi fallará en caso de empate. Aquí está la solución que funcionará en caso de empate:

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

Para tener en cuenta, el rango será 0 si el primer lugar tiene un puntaje de 0. Además, en caso de empates, el rango se incrementa, no se omite, p. 10 - 1º, 9º - 2º, 9º - 2º, 6º - 3º. Además, la extracción de filas debe hacerse en una subconsulta, ya que el orden se aplica después de las clasificaciones. – 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 
Cuestiones relacionadas