【问题标题】:Assign the same rank if multiple users have same count value如果多个用户具有相同的计数值,则分配相同的排名
【发布时间】:2013-12-26 07:46:36
【问题描述】:

我有两列的 user_points 表。

从 user_points 中选择 user_values,userid,根据我想为用户分配排名的 userid 计数。我已经写了这个查询

SELECT count_temp.* ,  @curRank:=(@curRank + 1) AS rank
 FROM (
    SELECT userid, COUNT(*) AS totalcount FROM user_points t GROUP BY t.userid
 ) AS count_temp 
, (SELECT @curRank := 0) r 
ORDER BY totalcount DESC;

给出结果:


用户名 |总数 |排名


2        6      1
3        2      2
4        2      3
1        1      4

但我想为用户 ID 3 和 4 分配排名 2,因为它们的总数相同..

【问题讨论】:

  • 所以 userid=1 应该有 3 或 4 的等级?
  • 不,userid=1 应该有 rank=4,其他用户应该有自己的 rank

标签: mysql


【解决方案1】:

要模拟RANK() 函数,它返回结果集分区内每一行的排名,您可以这样做

SELECT userid, totalcount, rank
  FROM
(
  SELECT userid, totalcount, 
         @n := @n + 1, @r := IF(@c = totalcount, @r, @n) rank, @c := totalcount 
    FROM 
  (
    SELECT userid, COUNT(*) AS totalcount 
      FROM user_points t 
     GROUP BY t.userid
     ORDER BY totalcount DESC
  ) t CROSS JOIN 
  (
    SELECT @r := 0, @n := 0, @c := NULL
  ) i
) q;

输出:

|用户名 |总数 |排名 | |--------|------------|------| | 2 | 6 | 1 | | 3 | 2 | 2 | | 4 | 2 | 2 | | 1 | 1 | 4 |

要模拟DENSE_RANK() 函数,它返回结果集分区内的行排名,排名没有任何差距,您可以这样做

SELECT userid, totalcount, rank
  FROM
(

  SELECT userid, totalcount, 
         @r := IF(@c = totalcount, @r, @r + 1) rank, @c := totalcount
    FROM 
  (
    SELECT userid, COUNT(*) AS totalcount 
      FROM user_points t 
     GROUP BY t.userid
     ORDER BY totalcount DESC
  ) t CROSS JOIN 
  (
    SELECT @r := 0, @c := NULL
  ) i
) q;

输出:

|用户名 |总数 |排名 | |--------|------------|------| | 2 | 6 | 1 | | 3 | 2 | 2 | | 4 | 2 | 2 | | 1 | 1 | 3 |

这是 SQLFiddle 两个查询的演示

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-10
    相关资源
    最近更新 更多