2017-02-02 126 views
1

我试图通过聚合函数获得排名值 - 我想看看它是否可以在MySQL查询(而不是ORM调用查询)内完成。排名查询结果聚合(计数)

表和数据我已经是这样的:

CREATE TABLE `interactions` (
    `id` bigint(20) NOT NULL AUTO_INCREMENT, 
    `account` varchar(100) COLLATE utf8_unicode_ci NOT NULL, 
    `timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM; 

INSERT INTO `interactions` VALUES 
(1, "xyz", "2017-01-01 00:05:01"), 
(2, "xyz", "2017-01-01 00:05:10"), 
(3, "abc", "2017-01-01 00:05:21"), 
(4, "xyz", "2017-01-01 00:05:43"), 
(5, "def", "2017-01-01 00:05:47"), 
(6, "xyz", "2017-01-01 00:05:49"), 
(7, "abc", "2017-01-01 00:05:50"), 
(8, "abc", "2017-01-01 00:05:59"); 

到目前为止,我有:

set @curRank := 0; 

select 
    @curRank := @curRank + 1 AS rank, 
    der.account, 
    der.searches 
from 
    interactions 
right join 
    (select account, count(id) AS searches from interactions group by account order by searches) AS der 
on 
    der.account = interactions.account; 

但这输出,在每个账户(用正确的searches值 - 但排名不止一次):

1 abc  3 
2 abc  3 
3 abc  3 
4 def  1 
5 xyz  4 
6 xyz  4 
7 xyz  4 
8 xyz  4 

我在寻找:

1 abc  3 
2 def  1 
3 xyz  4 

我应该提及的是,我不在乎联合排名 - 如果两个账户在表格中以相同的计数结束,那么他们是否依次排列(或排列顺序)并不重要)。

+0

见http://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what -seems-to-a-very-simple-sql-query – Strawberry

+0

@Strawberry - 你能否指出你认为从这个问题中缺少的东西?只是一个数据集? – HorusKol

+0

链接的答案是不言自明的 – Strawberry

回答

0

添加DISTINCT的SELECT修复查询:

set @curRank := 0; 

select distinct 
    der.account, 
    der.searches, 
    @curRank := @curRank + 1 AS rank 
from 
    interactions 
right join 
    (select account, count(id) AS searches from interactions group by account order by searches) AS der 
on 
    der.account = interactions.account;