Mysql 将一列置于另一列之上

Mysql 将一列置于另一列之上,mysql,sql,ranking,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 --------

我有一个表格:

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 a.userid , a.name minRank, 
       (select name from usertable where userid =a.userid and rank>a.rank 
        order by rank limit 1) nextMinRank
From (Select userid, name ,rank from usertable order by rank) as a
Group by userid, rank

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

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
如果可能有多个用户具有相同的排名,这取决于您希望如何处理这种情况,您可以添加以下内容:

group by t.userid

只展示其中一个。也许你也可以在选择上使用
GROUP\u CONCAT(t1.name),GROUP\u CONACT(t2.name)

不是最合适的。但是试试看

查询:

select b.userid, x.name1, b.name  as name2
from ranks b
join 
(
select a.userid, min(a.rank), a.name as name1
      from ranks a
      group by a.userid
) as x
on x.userid = b.userid
where (b.userid, b.rank, b.name) not in
(
select a.userid, min(a.rank), a.name
      from ranks a
      group by a.userid
)
group by b.userid
;
结果:

USERID  NAME1   NAME2
1       raj     frank
2       liz     neeta

这对我来说确实适用于相同的数据

SELECT  N1.USERID AS USERID,N1.NAME AS MIN_RANK, N2.NAME AS NEXT_RANK 
FROM (SELECT USERID,NAME FROM TABLE1 WHERE RANK IN(SELECT  Min(Table1.rank) AS MinOfrank FROM Table1 GROUP BY Table1.UserID))  N1,
(SELECT USERID,NAME FROM TABLE1 WHERE RANK IN (SELECT Min(RANK) AS Expr1 FROM TABLE1 WHERE (TABLE1.rank) Not In (SELECT MIN(RANK) FROM TABLE1 GROUP BY USERID)  GROUP BY USERID))  N2 
WHERE
N1.USERID=N2.USERID;

希望能有帮助

@Rahul+1来回答这个有趣的问题。查看此答案,并请评论任何想法和改进;)当我写作的时候,我在
小组会议()上也有同样的想法没有按我想要的方式工作。在我的例子中,我需要用户id是不同的。派生表(
a
)中的
ORDER BY
的目的是什么?因为如果表包含的秩值4大于15,则userid 3的秩值小于2,而group BY not work属性选择秩4而不是2,所以我在查询中使用了ORDER BY
USERID  NAME1   NAME2
1       raj     frank
2       liz     neeta
SELECT  N1.USERID AS USERID,N1.NAME AS MIN_RANK, N2.NAME AS NEXT_RANK 
FROM (SELECT USERID,NAME FROM TABLE1 WHERE RANK IN(SELECT  Min(Table1.rank) AS MinOfrank FROM Table1 GROUP BY Table1.UserID))  N1,
(SELECT USERID,NAME FROM TABLE1 WHERE RANK IN (SELECT Min(RANK) AS Expr1 FROM TABLE1 WHERE (TABLE1.rank) Not In (SELECT MIN(RANK) FROM TABLE1 GROUP BY USERID)  GROUP BY USERID))  N2 
WHERE
N1.USERID=N2.USERID;