如何仅在MySQL中获取下一行值

时间:2015-11-19 01:38:43

标签: mysql sql query-optimization

在我的表中,我有两列(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    |
+-------+------+

1 个答案:

答案 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;