在我的表中,我有两列(id,score):
+----+-------+
| Id | Score |
+----+-------+
| 1 | 3.50 |
| 2 | 3.65 |
| 3 | 4.00 |
| 4 | 3.85 |
| 5 | 4.00 |
| 6 | 3.65 |
+----+-------
如果您在DESC
上使用订单score
by子句,则整个表格将为:
+----+-------+
| Id | Score |
+----+-------+
| 3 | 4.00 |
| 5 | 4.00 |
| 4 | 3.85 |
| 2 | 3.65 |
| 6 | 3.65 |
| 1 | 3.5 |
+----+-------+
我的问题是当你迭代它时如何获得next score
值。
例如,如果我在row 1
,那么我想访问row 2
score
值为4.00。我尝试过使用inner join
,但它无效。我只想访问下一行score
值。 Inner join limit 1
也给了我上行值。如果您在下面看到我的查询:
select
c2.score
from
rank c1
join
rank c2 ON c2.id != c1.id
order by c1.score DESC , c2.score DESC
limit 1
我的最终结果应该是这样的:我需要根据得分排名
+-------+------+
| Score | Rank |
+-------+------+
| 4.00 | 1 |
| 4.00 | 1 |
| 3.85 | 2 |
| 3.65 | 3 |
| 3.65 | 3 |
| 3.50 | 4 |
+-------+------+
答案 0 :(得分:1)
我不知道你关于获得下一个分数的讨论与计算排名有什么关系。如果你想计算没有变量的排名,那么你可以这样做:
select r.*,
(select count(distinct r2.score)
from rank r2
where r2.score >= r.score
) as rank
from rank r;
在MySQL中,这通常使用变量更有效:
select r.*,
(@rn := if(@s = r.score, @rn,
if(@s := r.score, @rn + 1, @rn + 1)
)
) as rank
from rank r cross join
(select @rn := 0, @s := -1) params
order by r.score desc;