我有一个包含以下列的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
说明:
此处zxc
与UID=2
相关,在TAG=1
中排名第二,因此排名第二。
同样,qwe
与UID=2
相关,在TAG=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的计数,依此类推剩余的行,因此我们可以将这些计数用作实际上是等级的等级
编辑排名第问题
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
答案 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;