我有一个竞赛,代表可以在很多不同的商店,商店根据进入商店的人有分数。
我需要做的是选择商店的等级(其中id = x),根据积分值,如果商店被捆绑,那么等级应该相同(即首先联合的两个商店)< / p>
然后,我需要根据代表商店得分的总和来选择代表的等级。
商店
id name points rep_id
1 Regents Street 1501 3
2 Oxford Street 1500 2
3 Carnaby Street 1499 3
4 Edward Street 1499 1
5 Edward Street 1499 4
重复次数
id name
1 John Smith
2 John Doe
3 Joe Smit
3 Lou Jackson
商店排行榜:
1st - 1, Regents Street
2nd - 2, Oxford Street
3rd - 3,4,5
Rep排行榜:
1st - 3, Joe Smit (3000)
2nd - 2, John Doe (1500)
3rd - 1,4 (1499)
我有一个查询来获得商店排名,但它不适用于关系。
SELECT id,
name,
points,
FIND_IN_SET(points,
(SELECT GROUP_CONCAT(points
ORDER BY points DESC)
FROM stores)) AS rank
FROM stores
WHERE id = 1
由于
答案 0 :(得分:0)
我通常会使用变量进行此类排名:
select s.*,
(@rn := if(@p = points, @rn,
if(@p := points, @rn + 1, @rn + 1)
)
) as rank
from stores s cross join
(select @rn := 0, @p := -1)
order by s.points desc;
另一种方法是相关子查询:
select s.*,
(select count(distinct s2.points)
from stores s2
where s2.points >= s.points
) as rank
from store s;
这两个查询实际上都实现了dense_rank()
而不是rank()
。从你的问题不清楚你真正想要什么。并且,它们也可以修改为等级。
编辑:
如果你需要 reps 而不是商店(它似乎埋在问题的开头附近):
我认为这将在MySQL中起作用:
select s.rep_id,
(select count(distinct r2.points)
from (select s.rep_id, sum(s.points) as points
from stores s
group by s.rep_id
) r2
where r2.points >= r.points
) as rank
from (select s.rep_id, sum(s.points) as points
from stores s
group by s.rep_id
) r;