MySQL中的多重排名

时间:2017-09-20 12:05:13

标签: mysql sql

我有一个包含以下列的MySQL表:

这是我的表:test

ID    UID    TAG    Name    Points
1     1      1      asd     10
2     2      2      qwe     30
3     2      1      zxc     20
4     2      2      rty     20
5     3      1      fgh     40

我需要从表中获取与我在外部提供的特定用户(UID)相关的名称。对于所有名称,等级应根据标签与名称一起给出。

例如,选择查询为:

SELECT name, ... as rank from test ... where UID=2 ...

我应该得到结果:

Name   Rank
zxc    2
qwe    1
rty    2

说明:

此处zxcUID=2相关,在TAG=1中排名第二,因此排名第二。

同样,qweUID=2相关,在TAG=2中排名第一,因此它是第一位。

我希望任何人都可以帮我为此制定一个选择查询。

2 个答案:

答案 0 :(得分:1)

要获得基于标记和分数的排名,您可以使用以下内容

select t.*,
( select count(*)
  from test tt
  where t.TAG = tt.TAG
 AND t.Points <= tt.Points
) `rank`
from test t
where t.UID = 2
order by t.TAG

在上面的查询中,子查询部分将通过比较标记相同且第一参考表t的点小于或等于第二参考表tt的点的相同表来获得记录计数,因此对于行uid =&gt; 2 tag =&gt; 2 name =&gt; qwe&amp; points =&gt;将30与同一行进行比较。所有其他行将返回计数为1.行的相同情况uid =&gt; 2 tag =&gt; 2 name =&gt; rty&amp; points =&gt; 20当这一行与第一行比较时,它本身和所有其他行将返回2的计数,依此类推剩余的行,因此我们可以将这些计数用作实际上是等级的等级

DEMO

编辑排名第问题

select t.*,
( select count(*)
  from test tt
  where t.TAG = tt.TAG
 AND t.Points < tt.Points
) +1 `rank`
from test t
where t.UID = 2
order by t.TAG

DEMO

答案 1 :(得分:1)

对于每组值,变量@rank增加1,从而为重复值保持相同的值。

<强>查询

set @rank := 0; 
set @points := ''; 
select @rank := case when @points = Points then @rank else @rank + 1 end as rank, name,
@points := Points as Points
from your_table_name
where UID = 2
order by UID, Points desc;