我有一个简单的表 User
有两个属性 ID
和 AGE
现在我想根据 AGE
User Table
ID AGE
0 23
1 35
2 30
3 52
4 35
5 23
6 19
如果我执行 select * from User order by AGE ASC
我可以很容易地得到如下排序结果:
ID AGE
6 19
0 23
5 23
2 30
1 35
4 35
3 52
但我真正想得到的是:
ID RANK
6 0
0 1
5 1
2 3
1 4
4 4
3 6
我在下面想出了一个很好的解决方案,但它有一个小瑕疵
SELECT U1.ID, count(*) AS RANK
FROM User U1, User U2
WHERE U1.age > U2.age
GROUP BY U1.ID ORDER BY RANK;
这给了我:
ID RANK
0 1
5 1
2 3
1 4
4 4
3 6
这是正确的,除了我失去了排名零,因为 WHERE U1.age > U2.age
对最年轻的用户来说永远不是真的。
请说明这个问题,在此先感谢!
最佳答案
不幸的是,MySQL 仍然缺乏对分析函数的支持。在 MySQL 中模拟 RANK()
的一种方法
SELECT id, rank
FROM
(
SELECT id, @n := @n + 1, @r := IF(@a = age, @r, @n) rank, @a := age
FROM user CROSS JOIN (SELECT @n := -1, @r := -1, @a := NULL) i
ORDER BY age
) q
输出:
| ID | RANK | |----|------| | 6 | 0 | | 0 | 1 | | 5 | 1 | | 2 | 3 | | 1 | 4 | | 4 | 4 | | 3 | 6 |
Here is SQLFiddle demo
You should've told in your question that you actually using Postgres in the first place.'
Unfortunately @t-clausen.dk deleted his answer that is absolutely correct in the light of the discovered fact of you using Postgres which supports analytic functions
SELECT ID, RANK() OVER (ORDER BY age) - 1 rank
FROM "user"
这是最好的方法。
这是 SQLFiddle 演示
关于mysql - 基于一个表中的列进行排名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19784165/