Как создать рейтинг в рейтинге mysql? - PullRequest
0 голосов
/ 01 марта 2020

У меня есть список данных, мне нужно отобразить их рейтинг на основе их оценки, получить первые 1-3 или топ-10 легко, но могу ли я получить их рейтинг на основе их позиции в ряду? например, я пытаюсь получить первые два и два последних, если вы находитесь в середине строки.

Таблица пользователей

ID| User_id|Score|
1     1142    12
2     53      55
3     12      44
4     66      33
5     77      22
6     123     11
7     321     11
8     456     88
9     654     66
10    896     44
11    536     24
12    990     11

Так, например, user_id: 123 войдет в систему, Я должен быть в состоянии получить данные

ID| User_id|Score|
4     66      33
5     77      22
6     123     11
7     321     11
8     456     88

Я пытаюсь отобразить это на мой взгляд,

, как это. так что это будет вывод в представлении.

RANK 21:  1142
RANK 22:   77
RANK 23: 123
RANK 24:  N/A
RANK 25:  N/A

, и если нет ни ниже, ни выше его, это должно быть N / A, идея в том, что пользователь, который является логином, всегда должен быть в середине.

как я могу получить первые два и последние два? это возможно в MYSQL? и если нет ни ниже, ни выше его, что я должен делать. любая помощь будет очень признательна.

Ответы [ 3 ]

0 голосов
/ 01 марта 2020
SELECT ID,user_id,score
FROM users
WHERE user_id =123 OR user_id BETWEEN (LAG(LAG(user_id=123)) AND LEAD(LEAD(user_id=123)))
ORDER BY ID          
0 голосов
/ 02 марта 2020

Можно сказать, что относительный ранг для 123 равен 0, а относительный ранг для других интересующих нас строк равен -2, -1,1,2. Как только мы получим это значение и действительное значение для 123, можно легко рассчитать фактическое значение для других строк.

select t.rnk + relativerank as finalrank,
         coalesce(dummy,'n/a') finaluserid  

from
(
select 0 as relativerank,t.*, 123 as dummy from t where user_id = 123
union all
select -1 ,t.*,(select user_id from t t1 where t1.Score > t.score order by t1.score asc  limit 0,1) plus1  from t where user_id = 123
union all
select -2, t.*,(select user_id from t t1 where t1.Score > t.score order by t1.score asc  limit 1,1) plus2  from t where user_id = 123
union all
select 1, t.*,(select user_id from t t1 where t1.Score < t.score order by t1.score desc limit 0,1) minus1 from t where user_id = 123
union all
select 2, t.*,(select user_id from t t1 where t1.Score < t.score order by t1.score desc limit 1,1) minus2 from t where user_id = 123
) s
left join
(select  t.*, 
            if(score <> @p,@rnk:=@rnk+1,@rnk:=@rnk) rnk,
            @p:=score p
from t
cross join (select @rnk:=0,@p:=0) r
order by score desc
) t
on t.user_id = s.user_id
order by finalrank ;

+-----------+-------------+
| finalrank | finaluserid |
+-----------+-------------+
|         7 | 77          |
|         8 | 1142        |
|         9 | 123         |
|        10 | n/a         |
|        11 | n/a         |
+-----------+-------------+
5 rows in set (0.05 sec)
0 голосов
/ 01 марта 2020

вы можете попробовать что-то вроде следующего:

select * from  users where User_id=123
union all (
  select * from users 
  where User_id <  123
   limit 2
) 
union all (
  select * from users 
  where User_id > 123 limit 2
) 
order by User_id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...