MySQL - 根据表中出现的名称对用户进行排名;从名称中查找排名

时间:2013-10-27 22:57:53

标签: mysql sql database

我有一个包含多个用户记录的表,按日期排序。用户的统计数据保留在那里,并为每个事件创建一个新条目。

我创建了一个查询,根据事件:

获取前10个用户
SELECT * FROM (
    SELECT name, COUNT( * ) AS occurrences 
    FROM users 
    GROUP BY name 
    ORDER BY occurrences DESC LIMIT 10
) AS rank;

它会正确报告所有前10位用户以及每次显示的次数。

但是,我希望能够搜索某个用户,并且不仅会报告他出现的次数,还会报告他的整体排名。如果按发生次数排序所有用户,则排名将是他在列表中的位置。

我一直在尝试使用SELECT ROW_NUMBER(),但我总是得到无效的语法,不幸的是,我不确定我做错了什么。我一直在尝试我在网上找到的随机内容,但似乎都没有。

找到用户排名的最佳方法是什么?只有一个查询,如果可能的话。

谢谢, 努诺

1 个答案:

答案 0 :(得分:3)

基于我在评论中链接的答案,我正在摆弄它并想出了这个:

SELECT *
FROM (
  SELECT NAME, occurrences, @rownum := @rownum + 1 AS position
  FROM (
    SELECT NAME, COUNT(*) AS occurrences
    FROM users
    GROUP BY NAME
    ORDER BY occurrences DESC LIMIT 10
    ) a
  JOIN (
    SELECT @rownum := 0
    ) r
  ) b
WHERE NAME = "bbb"

此查询根据COUNT返回用户及其位置。

如果您只想要带有排名的有序列表,只需删除外部选择:

SELECT name,occurrences,@rownum := @rownum + 1 AS position
FROM (
    SELECT name, COUNT(*) AS occurrences 
    FROM users 
    GROUP BY name 
    ORDER BY occurrences DESC LIMIT 10
) a
JOIN (SELECT @rownum := 0) r;

sqlfiddle demo