Mysql

獲取行的排名

  • December 26, 2021

我正在使用mysql Ver 14.14 Distrib 5.7.21, for Linux (x86_64).

我有一個表推薦:

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`)
);

在表格中,您基本上插入了人和推薦人。

我創建了以下排行榜:

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;

這給了我:

但是,我想得到:

在 DB Fiddle 上查看

我使用 faker php 外掛創建了以下dbfiddle 。

我嘗試使用 mysqlRANK()功能。但是,我正在努力如何正確使用它。

感謝您的回复!

您可以嘗試:

select referred_by, referred_by_count, @rank := @rank+1
from (
   select  referred_by,
           count(referred_by) as referred_by_count
   from referrals r
   group by referred_by
   order by referred_by_count DESC, referred_by
) as t
cross join ( select @Rank := 0 ) o
order by referred_by_count desc, referred_by;

但我不認為結果是確定性的。RANK() 是 BTW 一個存在於 MySQL 8+ 中的視窗函式。如果可能升級到更新版本的 MySQL,濫用上述變數可能會在您的應用程序中引入神秘的錯誤

db小提琴

引用自:https://dba.stackexchange.com/questions/305388