【问题标题】:How to create a leaderboard ranking in mysql?如何在mysql中创建排行榜排名?
【发布时间】:2020-03-01 10:54:12
【问题描述】:

我有一个数据列表,我需要根据他们的分数显示他们的排名,获得前 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 中可能吗?如果没有低于或高于他我该怎么办。任何帮助将不胜感激。

【问题讨论】:

  • '如果没有低于或高于他我该怎么办' - 你将不得不告诉我们应该发生什么。期望的输出与排名有什么关系?
  • 嗨先生,我编辑了我的问题,对不起。
  • 考虑在你的 php 循环中处理排名

标签: php mysql codeigniter


【解决方案1】:

您可以尝试以下方法:

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

【讨论】:

  • 它仍然没有工作,先生。我没有得到准确的行,我只得到四行。
【解决方案2】:
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          

【讨论】:

  • #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ') AND LEAD(LEAD(user_id))) END) AS user_id FROM users WHERE user_id =123 我有这些错误先生
  • @Janessa Bautista mariadb 不是 mysql 你应该标记问题 mariadb 并检查你的版本是否支持窗口函数。
【解决方案3】:

您可以说 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)

【讨论】:

    猜你喜欢
    • 2013-08-31
    • 2018-01-31
    • 2015-01-29
    • 2021-03-09
    • 1970-01-01
    • 2011-10-29
    • 2020-05-26
    • 1970-01-01
    相关资源
    最近更新 更多