带有关系的mysql组排名

时间:2015-08-02 13:48:02

标签: mysql

我在stackOverflow找到了这个Q& A,同时搜索了对排名数据进行分组的方法。这些解决方案完美无缺,但如何解释群体内部的联系?

到目前为止,我知道如何排名,但我不知道如何解释群体中的关系。

+--------------------------------------------+
|   id         |   code       | score | rank |
+--------------------------------------------+ 
| 2477         |          312 |    64 |    1 |
| 1865         |          312 |    63 |    2 |
| 2511         |          312 |    62 |    3 |
| 2890         |          312 |    61 |    4 |
| 1335         |          312 |    61 |    5 |
| 1504         |          312 |    60 |    6 |
| 1385         |          312 |    60 |    7 |
| 1984         |          312 |    59 |    8 |
| 2477         |          212 |    64 |    1 |
| 1865         |          212 |    63 |    2 |
| 2511         |          212 |    62 |    3 |
| 2890         |          212 |    61 |    4 |
| 1335         |          212 |    61 |    5 |
| 1504         |          212 |    60 |    6 |
| 1385         |          212 |    60 |    7 |
| 1984         |          212 |    59 |    8 |

我需要的是:

+--------------------------------------------+
|   id         |   code       | score | rank |
+--------------------------------------------+ 
| 2477         |          312 |    64 |    1 |
| 1865         |          312 |    63 |    2 |
| 2511         |          312 |    62 |    3 |
| 2890         |          312 |    61 |    4 |
| 1335         |          312 |    61 |    4 |
| 1504         |          312 |    60 |    5 |
| 1385         |          312 |    60 |    5 |
| 1984         |          312 |    59 |    6 |
| 2477         |          212 |    64 |    1 |
| 1865         |          212 |    63 |    2 |
| 2511         |          212 |    62 |    3 |
| 2890         |          212 |    61 |    4 |
| 1335         |          212 |    61 |    4 |
| 1504         |          212 |    60 |    5 |
| 1385         |          212 |    60 |    5 |
| 1984         |          212 |    59 |    6 |

有没有办法获得上述结果?

1 个答案:

答案 0 :(得分:0)

如果您需要在同一代码组中为相同分数指定相同的排名,则必须嵌套case语句

select `id`, `code`, `score`,rank
from (
select `id`, `code`, `score`,
@r:= case when @g = `code` 
     then 
         case when @s <> `score` then @r + 1 else @r end 
      else  1
       end rank,
@g:= `code`,
@s:= `score`
from table1 
cross join(select @g:=null,@r:=0,@s:=null) t
order by `code` desc, `score` desc
) t1

首先case语句将检查相同的code组,如果找到相同的代码,则then部分父case中会有另一个孩子{{1} }语句将检查分数是否与前一个不同,然后增加排名变量,否则将相同的排名分配给当前行

DEMO