Eu estou tentando obter valores classificados por uma função agregada - e eu gostaria de ver se isso pode ser feito dentro da consulta MySQL (em vez de o ORM chamar a consulta).
A tabela e os dados que eu tenho são algo como:
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");
Até agora eu tenho:
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;
Mas isso gera todas as contas (com a correta searches
valor - mas classificado mais de uma vez):
1 abc 3
2 abc 3
3 abc 3
4 def 1
5 xyz 4
6 xyz 4
7 xyz 4
8 xyz 4
Estou procurando por:
1 abc 3
2 def 1
3 xyz 4
Eu devo mencionar que eu não me preocupo com ranks - se duas contas acabam com a mesma contagem na tabela, então não importa se elas são classificadas uma após a outra (ou que ordem).
Respostas:
0 para resposta № 1Adicionar um DISTINCT ao SELECT corrige a consulta:
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;