2011-03-19 34 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