【问题标题】:MySQL Select RankMySQL 选择排名
【发布时间】:2015-06-07 21:08:59
【问题描述】:

我有一个比赛,代表可以在许多不同的商店中进行,商店根据进入商店的人来获得积分。

我需要做的是根据积分值选择一家商店的排名(其中 id = x),如果一家商店是并列的,那么排名应该是相同的(即首先联合两家商店)

然后我需要根据代表商店分数的总和来选择代表的排名。

商店

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

代表排行榜:

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

谢谢

【问题讨论】:

  • 请使用示例数据和所需结果编辑您的问题。
  • 我已经根据数据添加了所需的排名。

标签: mysql


【解决方案1】:

我通常会使用变量来进行此类排名:

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 而不是 stores (这似乎隐藏在问题的开头附近):

我认为这将在 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;

【讨论】:

  • 第二个查询给出了我需要的结果,然后如何根据每个代表商店分数的 SUM 获得相同类型的结果?
猜你喜欢
  • 1970-01-01
  • 2018-01-03
  • 2018-05-12
  • 2020-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多