1

最近两天,我一直在询问有关Mysql中排名查询的问题。到目前为止,我有工作查询

  1. 查询表中的所有行并按其排名排序。
  2. 仅查询一行及其排名

这是我昨晚的问题的链接

如何获得行排名?

您可能会注意到,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
4

1 回答 1

2

不要对子查询感到恐慌。子查询并不总是很慢 - 仅在某些情况下。您的查询的问题是它需要完全扫描

这是一个应该更快的替代方案:

SELECT COUNT(DISTINCT points) + 1
FROM points
WHERE points > (SELECT points FROM points WHERE id = 3)

添加一个索引id(我猜你可能想要一个主键)和另一个索引points以使这个查询有效地执行。

于 2011-03-19T09:05:58.893 回答