我正在使用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;
这给了我:
由......推荐 | 参考计数 | 秩 |
---|---|---|
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 |
但是,我想得到:
由......推荐 | 参考计数 | 秩 |
---|---|---|
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 |
我使用 faker php 插件创建了以下dbfiddle 。
我尝试使用 mysqlRANK()
功能。但是,我正在努力如何正确使用它。
感谢您的回复!
您可以尝试:
但我不认为结果是确定性的。RANK() 是 BTW 一个存在于 MySQL 8+ 中的窗口函数。如果可能升级到更新版本的 MySQL,滥用上述变量可能会在您的应用程序中引入神秘的错误
db小提琴
看起来你只需要
ROW_NUMBER()
,在 MySQL 8+ 中支持db-fiddle.com
请注意,绑定行的结果是不确定的:您可能希望添加另一列来排序。