estou usando mysql Ver 14.14 Distrib 5.7.21, for Linux (x86_64)
.
Estou tendo uma referência de tabela:
CREATE TABLE `referrals` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`referred_by` bigint(20) unsigned DEFAULT NULL,
`referral_token` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`email` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `referrals_email_unique` (`email`)
);
Na tabela você basicamente insere a pessoa e quem a encaminhou.
Criei a seguinte tabela de classificação:
select
referred_by,
count(referred_by) as referred_by_count,
@curRank := @curRank + 1 AS rank
from
referrals r,
(
SELECT
@curRank := 0) o
group by
referred_by
order by
referred_by_count DESC;
Isso me dá:
referido por | refer_by_count | classificação |
---|---|---|
10 | 3 | 3 |
2 | 2 | 1 |
3 | 2 | 2 |
13 | 2 | 5 |
11 | 2 | 6 |
15 | 1 | 8 |
12 | 1 | 9 |
4 | 1 | 4 |
9 | 1 | 7 |
No entanto, gostaria de obter:
referido por | refer_by_count | classificação |
---|---|---|
10 | 3 | 1 |
2 | 2 | 2 |
3 | 2 | 3 |
13 | 2 | 4 |
11 | 2 | 5 |
15 | 1 | 6 |
12 | 1 | 7 |
4 | 1 | 8 |
9 | 1 | 9 |
Eu criei o seguinte dbfiddle usando o plugin faker php.
Eu tentei usar a RANK()
função mysql. No entanto, estou lutando como usá-lo corretamente.
Eu aprecio suas respostas!
Você poderia tentar com:
Mas não acho que o resultado seja garantido como determinista. RANK() é BTW uma função de janela presente no MySQL 8+. Se possível, atualize para uma versão mais recente do MySQL, abusando de variáveis como acima pode introduzir bugs misteriosos em seu aplicativo
db-fiddle
Parece que você só precisa
ROW_NUMBER()
, suportado no MySQL 8+db-fiddle. com
Observe que os resultados não são determinísticos para linhas empatadas: você pode querer adicionar outra coluna para ordenar.