2013-10-27 39 views
3

我有一个包含多个用户记录的表格,按日期排序。用户的统计数据保存在那里,并为每个事件创建一个新条目。MySQL - 根据表中的名称出现排名用户;从名称查找排名

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

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

感谢, 努诺

+0

看到这个答案,让你开始:http://stackoverflow.com/ a/3614741/1385896 –

回答

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

+0

非常感谢,它工作。顺便说一句,在第一个你有“:=”而不是“:=”,这会导致语法错误。 – Nuno