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;