嗨,
我实际上发布了类似的(还是相同的?)昨天的问题,但我认为我需要张贴一个新的问题,因为我有简短,但明确的问题。
我有下表。
id point
1 30
2 30
3 29
4 27
5 28
6 26我想要的:
添加:3/18
我尝试了Logan的查询,但是得到了以下结果
id point rank
1 30 1
2 30 1
3 29 3
4 27 5
5 28 4
6 26 6发布于 2011-03-18 03:36:13
您所推荐的子查询方法将进行二次缩放。http://www.xaprb.com/blog/2006/12/02/how-to-number-rows-in-mysql/展示了一种使用用户变量的更有效的方法。下面是一个未经测试的适应您的问题的方法:
@points := -1; // Should be an impossible value.
@num := 0;
SELECT id
, points
, @num := if(@points = points, @num, @num + 1) as point_rank
, @points := points as dummy
FROM `users`
ORDER BY points desc, id asc;发布于 2011-03-18 03:02:51
数一下有多少人比他们有更多的分数。
select count(1) from users
where point > (select point from users where id = 2) group by point这将给出为给定用户提供更多积分的人数。因此,对于用户1和用户2,结果将是0(0),这意味着它们是第一位的。
发布于 2011-03-18 03:18:29
当我需要做类似的事情时,我创建了一个视图,如下所示:
CREATE VIEW rankings_view
AS
SELECT id
, point
, (select count(1)
from points b
where b.point > a.point) +1 as rank
FROM points as a;这显然是假定原始表被命名为points。然后,通过查询视图,您可以获得任意id的级别,或与任何级别对应的id。
编辑
如果要计算每个点值之上的不同点值的数目,而不是当前点值以上的点值的条目数,则可以执行以下操作:
CREATE VIEW rankings_view2
AS
SELECT id
, point
, (SELECT COUNT(1) +1 AS rank
FROM ( SELECT DISTINCT point
FROM points b
WHERE b.point >a.point ))
FROM points AS a;备注
提出的其他一些解决方案的性能肯定优于这个解决方案。它们是mysql特有的,所以我不能真正地将它们用于我正在做的事情。我的应用程序最多有128个实体要排名,所以这对我来说已经足够好了。但是,如果您可能有大量的行,那么您可能需要考虑使用这里介绍的其他解决方案之一,或者限制排名的范围。
https://stackoverflow.com/questions/5347565
复制相似问题