2011-03-19 40 views
1

在过去的两天里,我一直在问Mysql中的等级查询。到目前为止,我有工作查询如何优化我的查询(等级查询)?

  1. 查询表中的所有行并按顺序排列。
  2. 查询只有一排,其排名

这里是从昨晚

How to get a row rank?

我的问题的链接正如你可能已经注意到,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 

回答

1

不要进入一个有关子查询的恐慌。子查询不是总是很慢 - 仅在某些情况下。您的查询的问题是它需要完整扫描

这里有一个替代方案,应该会更快:

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

id添加一个索引(我猜你可能想要在此主键)和points另一个指标,使这一查询高效地执行。

+0

//感谢您的输入。我刚添加了6行的示例表。你的查询对于id#1,2的工作正常,但是我得到了id#3的不同结果。我期待2作为结果,但我得到3.我如何得到2,而不是3为id#3?我得到3是因为有两个记录(#1和#2)的值高于#3。 – Moon 2011-03-19 09:10:22

+0

@Moon:修改'COUNT(*)'到'COUNT(DISTINCT points)'。查看更新。 – 2011-03-19 09:13:40

+0

//最后!!!我真的很感谢你的帮助!周末愉快! (我会在你的帮助下!) – Moon 2011-03-19 09:15:20