我正在使用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;
這給了我:
| referred_by | referred_by_count | rank |
| ----------- | ----------------- | ---- |
| 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 |
但是,我想得到:
| referred_by | referred_by_count | rank |
| ----------- | ----------------- | ---- |
| 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 |
---
[View on DB Fiddle](https://www.db-fiddle.com/f/o42zo6XiJZzEbrrVDfgQR4/3)
我使用 faker php 插件創建了以下dbfiddle。
我嘗試使用 mysqlRANK()函式。但是,我正在努力如何正確使用它。
我感謝您的回復!
uj5u.com熱心網友回復:
SELECT referred_by, referred_by_count, @rank := @rank 1 `rank`
FROM ( SELECT referred_by, COUNT(*) referred_by_count
FROM referrals
GROUP BY referred_by ) counts
CROSS JOIN ( SELECT @rank := 0 ) init_var
ORDER BY referred_by_count DESC, referred_by ASC;
https://dbfiddle.uk/?rdbms=mysql_5.7&fiddle=6dd102f3bc88cd939efe769b5804e757
附注。referred_by被添加到 ORDER BY 運算式中,以使排序確定,從而使輸出具有確定性。
聚苯乙烯。在輸出串列中使用 UDV 處理的查詢必須 (1) 只有一個源表 (2) 有適當的 ORDER BY (3) 沒有 GROUP BY 和 HAVING。如果需要以上內容,則必須在子查詢中執行。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/393640.html
下一篇:從.txt檔案運行mySql命令
