在另一列上排名一列

Rah*_*wal 7 mysql sql ranking

我有一张表格:

userid  rank  name
-------------------
1       4     raj
1       90    frank
1       100   neeta
1       123   liz
2       2     liz
2       20    neeta
2       23    frank
2       222   raj
Run Code Online (Sandbox Code Playgroud)

我需要把它转换成

userid  min_rank  next_min_rank
-------------------------------
1       raj       frank
2       liz       neeta
Run Code Online (Sandbox Code Playgroud)

我一直在网上搜索这个问题很长一段时间但找不到解决方案.

能否请你帮忙?

fth*_*lla 2

此查询将为每个用户选择最小排名和下一个排名:

select s.userid, s.min_rank, min(users.rank) as next_rank
from (
  select userid, min(rank) as min_rank
  from users
  group by userid) s left join users
  on users.userid = s.userid and s.min_rank<users.rank
group by s.userid
Run Code Online (Sandbox Code Playgroud)

这将显示名称:

select t.userid, t1.name, t2.name
from (
  select s.userid, s.min_rank, min(users.rank) as next_rank
  from (
    select userid, min(rank) as min_rank
    from users
    group by userid) s left join users
    on users.userid = s.userid and s.min_rank<users.rank
  group by s.userid ) t
  left join users t1 on t.userid=t1.userid and t.min_rank=t1.rank
  left join users t2 on t.userid=t2.userid and t.next_rank=t2.rank
Run Code Online (Sandbox Code Playgroud)

结果是:

1  raj  frank
2  liz  neeta
Run Code Online (Sandbox Code Playgroud)

如果可能有多个具有相同等级的用户,这取决于您想要如何处理这种情况,您可以添加以下内容:

group by t.userid
Run Code Online (Sandbox Code Playgroud)

仅显示其中之一。GROUP_CONCAT(t1.name), GROUP_CONACT(t2.name)也许你也可以在选择上使用。