2014-02-07 2 views
-1

Ранжируйте пользователей с одинаковыми рангами, если у них одинаковые очки, а затем пропустите остальную часть звания.sql рейтинг, когда 5 пользователей имеют одинаковые очки и ранги, должны быть пропущены, если у пользователей одинаковый ранг

Например, в приведенной ниже таблице показано, что пользователь 5 первым ответил 3 раза, поэтому его рейтинг будет превыше всего, тогда пользователь 4, а затем user1, а остальное? Я очень ценю любую помощь. Спасибо заранее.

SELECT name, 
      (select count(*) 
      from users u2 
      where u2.points > u.points or 
        u2.points = u.points and u2.sno <= u.sno 
      ) as rank 
    FROM `users` u GROUP BY `name` , `sno` 
ORDER BY CAST(points AS UNSIGNED) DESC; 

ПОЛЬЗОВАТЕЛЕЙ:

SNO points first_to_respond name 
1 100 1     a 
2 100 0     b 
3 100 0     c 
4 100 2     d 
5 100 3     e 
+0

если вы хотите знать, что делает запрос, просто запустите его и посмотрите. – Barmar

+0

Что такое '' sno' в запросе? – Barmar

+0

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

ответ

1

Чтобы получить правильное ранжирование, как вы просите:

SELECT name, 
     (select count(*) + 1 
     from users u2 
     where u2.points > u.points 
     ) as rank 
FROM `users` u; 

Это подсчитывает число, которые имеют больше очков, а затем добавляет 1 к этому значению ,

Если вы хотите заказать какой-либо другой фактор, а также, то сделать что-то вроде:

SELECT name, 
     (select count(*) + 1 
     from users u2 
     where u2.points > u.points or 
       u2.points = u.points and u2.first_to_respond < u.first_to_respond 
     ) as rank 
FROM `users` u; 

(. Я не уверен, что второе условие должно быть < или >)

+0

В основном это должно быть e> d> a> b> c – jason

+0

Привет, я застрял на точке: разве это не «от пользователей AS u2'? Благодарю. – loveNoHate

+0

@ dollarvar. , , 'As' является необязательным как для псевдонимов таблиц, так и для псевдонимов столбцов. Для псевдонимов столбцов 'as' является хорошей формой, потому что это предотвращает потенциальную путаницу. Для псевдонимов таблиц он просто имеет тенденцию к сбою запросов. –

Смежные вопросы