mysql - 在另一列上排列一列

标签 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

我需要把它转换成

userid  min_rank  next_min_rank
-------------------------------
1       raj       frank
2       liz       neeta

我已经在网上搜索了很长时间,但找不到解决方案。

你能帮忙吗?

最佳答案

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

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

只显示其中一个。也许您还可以在选择上使用 GROUP_CONCAT(t1.name), GROUP_CONACT(t2.name)

关于mysql - 在另一列上排列一列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13974281/

相关文章:

php - MySQL 从恰好 7 天前选择行

MySQL 查询帮助作为附加格式

MySQL - 使用 GROUP BY 和 DESC

php - PHP 平均排名

sql - 我如何找到每年的前 N ​​名击球手?

algorithm - 评估排名算法

sql - MySQL 中如何遍历嵌套集合模型?

php 将 string 转换为 int 没有给出正确的值

mysql - 将时间间隔拆分为 1 小时间隔 mysql

sql - T-SQL UPDATE 中的每一行的 RAND 不不同