过去两天,我一直在询问有关Mysql中排名查询的问题。到目前为止,我有
的查询以下是我昨晚提问的链接
你可能会注意到,btilly的查询非常快。
这是一个查询,只根据btilly的查询获得我的排名的一行。
set @points = -1;
set @num = 0;
select * from (
SELECT id
, points
, @num := if(@points = points, @num, @num + 1) as point_rank
, @points := points as dummy
FROM points
ORDER BY points desc, id asc
) as test where test.id = 3
上面的查询是使用子查询..所以我担心性能。
我还可以使用其他更快的查询吗?
表格点
id points
1 50
2 50
3 40
4 30
5 30
6 20
答案 0 :(得分:1)
不要对子查询感到恐慌。子查询总是慢 - 仅在某些情况下。您的查询存在的问题是它需要完整扫描。
这是一个应该更快的替代方案:
SELECT COUNT(DISTINCT points) + 1
FROM points
WHERE points > (SELECT points FROM points WHERE id = 3)
在id
上添加一个索引(我猜你可能想要一个主键)和points
上的另一个索引,以使这个查询有效地执行。