【问题标题】:Ranking multiple entries sql排序多个条目sql
【发布时间】:2015-03-12 11:26:10
【问题描述】:

我有一个表格,我在其中记录了每个用户在其个人资料页面上的访问。 鉴于表条目就像

 id user time ip

是否可以使用单个查询显示某个用户的访问排名?

示例:您的排名:#400 - 表示用户在页面点击次数上排名第 400。

【问题讨论】:

  • 是的。只需按数量分组并按数量排序。您可以稍后在编程中附加实际排名(通过在迭代结果时将数字加 1)
  • 按时间从urtable order中选择count(user);
  • @h2ooooooo,这似乎可以将排名定期应用于我的所有用户(我也在查看此选项) - 但在这种情况下,我只想显示给定用户的排名。我已经尝试使用 count 和 group BY 和 order BY 进行查询 - 似乎运行速度很慢(几乎 1 M 条目)。
  • user 列上是否有索引?
  • 我在运行一些测试和写评论之前创建了一个索引。 2秒查询。

标签: mysql


【解决方案1】:

这是一种方法。最里面的子查询计算每个用户的访问次数。下一个子查询计算一个名为@uservisits 的变量,该变量存储给定用户的值。然后外部查询使用它来计算排名:

select count(*) as rank
from (select user, numvisits, @uservisits := if(user = $user, numvisits, @uservisits)
      from (select user, count(*) as numvisits
            from table t
            group by user
           ) t cross join
           (select @uservisits := 0) init
     ) t
where numvisits >= @uservisits

【讨论】:

  • 非常快,正是我所需要的。请将 $uservisits 编辑为 @uservisits 谢谢! :)
【解决方案2】:

这种事?

SELECT  @rank := @rank+1 AS rank, province, cityCount
    FROM
      ( SELECT  @rank := 0 ) z
    JOIN
      ( SELECT  province, COUNT(*) AS cityCount
            FROM  Canada
            GROUP BY  province
      ) x
    ORDER BY  cityCount DESC;
+------+---------------------------+------------+
| rank | province                  | cityCount  |
+------+---------------------------+------------+
|    1 | Quebec                    |       1045 |
|    2 | Ontario                   |        891 |
|    3 | British Columbia          |        716 |
|    4 | Saskatchewan              |        573 |
|    5 | Alberta                   |        573 |
|    6 | Newfoundland and Labrador |        474 |
|    7 | Nova Scotia               |        331 |
|    8 | Manitoba                  |        299 |
|    9 | New Brunswick             |        210 |
|   10 | Yukon                     |        114 |
|   11 | Nunavut                   |        107 |
|   12 | Northwest Territories     |         94 |
|   13 | Prince Edward Island      |         57 |
+------+---------------------------+------------+

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-28
    • 1970-01-01
    • 2013-09-13
    • 1970-01-01
    • 1970-01-01
    • 2011-06-20
    相关资源
    最近更新 更多