このクエリは、最小ランクと、すべてのユーザーの次のランクを選択します。
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
antこれは名前を表示します:
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
結果は次のとおりです。
1  raj  frank
2  liz  neeta
同じランクのユーザーが複数いる可能性がある場合は、状況をどのように処理するかによって異なります。次のように追加するだけです。
group by t.userid
それらの1つだけを表示します。たぶん、あなたはまたGROUP_CONCAT(t1.name), GROUP_CONACT(t2.name)、選択で使用することができます。