3

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

我创建了一个查询,根据出现情况获取前 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() 但我总是得到无效的语法,不完全确定我做错了什么,不幸的是。我一直在尝试我在网上找到的随机东西,但似乎没有一个有效。

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

谢谢,努诺

4

1 回答 1

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

于 2013-10-27T23:26:25.610 回答