【问题标题】:MySQL paginated list of user ranking along with RankingMySQL分页的用户排名列表以及排名
【发布时间】:2021-10-27 02:51:09
【问题描述】:

MySQL V 8.0

我需要获取用户的分页列表以及他们的排名,但应该始终添加特定的用户记录(例如结果应该始终有一个名为“Alex”的用户记录)。尽管我已经合并了查询并达到了预期的结果,但正在考虑通过两次执行相同的查询来增加数据库的开销。 需要任何改进建议。

create table userData (recordDate date ,userName varchar(10), score FLOAT);
insert into userData (recordDate, userName, score)
values
    ('2020/8/1','Chris', 78),
    ('2021/8/2','Aamir', 77),
    ('2021/8/3','Alex', 76),
    ('2021/8/1','Ali', 78);

我的解决方案

select * from (
  
(select userName, score,
ROW_NUMBER() over (
order by score desc
)scores_rank
from userData
 limit 2)

union
  
(
select * from (
  select 
    userName, score,
    ROW_NUMBER() over (
    order by score desc
   )scores_rank
  from userData
) as singleUser
where userName="Alex")

) as main;

想要的输出是


| userName | score | scores_rank |
| -------- | ----- | ----------- |
| Chris    | 78    | 1           |
| Ali      | 78    | 2           |
| Alex     | 76    | 4           |


【问题讨论】:

    标签: sql select union row-number mysql-8.0


    【解决方案1】:
    set @page := 1;
    set @limit := 2;
    
    WITH ranks AS (
        SELECT *, ROW_NUMBER() OVER (ORDER BY score DESC) AS score_rank
        FROM userData
    ) 
    SELECT * 
    FROM ranks 
    WHERE score_rank BETWEEN (@page - 1) * @limit + 1 AND @page * @limit
       OR userName = 'Alex'
    ORDER BY score_rank
    

    db<>fiddle

    【讨论】:

      猜你喜欢
      • 2019-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-13
      • 1970-01-01
      • 2013-01-17
      • 1970-01-01
      • 2010-11-20
      相关资源
      最近更新 更多