2009-08-18 2 views
10

У меня есть таблица MySQL, как показано ниже:MySQL, получить пользователи ранга

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

Я в принципе хочу, чтобы получить индивидуальный рейтинг пользователей без выбора всех пользователей. Я только хочу выбрать одного пользователя по id и получить рейтинг пользователей, который определяется количеством очков, которые у них есть.

Например, получить обратно Том с ранга 2 выбора по идентификатору 3.

Приветствия

Eef

ответ

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 

Плотные Оценка:

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

Приветствия приятель, работает отлично – RailsSon

+0

я люблю его. Немного настройки, и это соответствует моим потребностям. Tnx для обмена! – 2012-01-02 18:17:46

+0

Незначительная проблема: если есть связи, это вернет наивысший ранг, а не самый низкий. Если вы хотите самый низкий, измените условие на '>' и значение на 'COUNT (*) + 1'. – Barmar

2

Решение от @ Квасной провалится в случае связей. Вот решение, которое будет работать в случае связей:

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

Следует отметить, что ранг будет 0, если первое место имеет оценку 0. Кроме того, в случае связей ранг увеличивается, а не пропущен, например. 10 - 1, 9 - 2, 9 - 2, 6 - 3. Кроме того, выборка строк должна быть в подзапросе, поскольку порядок применяется после ранжирования. – 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