我不知道我是不是囫圇吞棗這一點,但...如果您正在尋找特定用戶在其他人的排名之內,我會找出該人的「averageScore」是什麼,然後獲得所有記錄的COUNT(*),其平均比您想要的要好,然後得到那個人的名字......有道理?然後嘗試以下。
REVISED AND TESTED -- SQL FIDDLE 上SQLFiddle該樣品具有爲用戶A-F和10-60分別averageScores 6項。查詢選擇用戶3(avgScore),因此具有3(d,e和f)具有較高的平均值(40,50,60),其將用戶'c'(id 3)置於第四位。
SELECT
u.UserName,
PreQuery.AverageHigherThanYou +1 as UserRank
from
users u,
(select
COUNT(*) as AverageHigherThanYou
from
scoreListing s,
(select @MyAvg := s2.AverageScore
from scoreListing s2
where s2.UserID = 95890) sqlvars
where
s.AverageScore > @MyAvg) PreQuery
where
u.userid = 95890
的「PreQuery」只是讓那些小於計數靜態地連結到scoreListing爲特定的用戶,並把到一個單一的列值。
然後逗號用戶表(舊的ANSI,沒有連接標準)將始終返回一條記錄...然後,只在USER表上爲一個人應用WHERE子句以獲取其名稱信息。
現在,如果你想有多少人更高,相同或更低的平均水平,你可以調整查詢類似
(SELECT
sum(if(s.averageScore < s2.averageScore, 1, 0)) as LowerAverageThanYou,
sum(if(s.averageScore = s2.averageScore, 1, 0)) as SameAverageAsYou,
sum(if(s.averageScore > s2.averageScore, 1, 0)) as HigherAverageThanYou
from
scoreListing s
join scoreListing s2
ON s2.UserID = 95890) PreQuery,
顯然,你必須等待,直到你的機器得到釋放出的重試。
我也會在scoreListing表上有兩個索引。其中一個用於跳轉到UserID = 95890的記錄,用於比較該用戶的平均值和另一個用於averageScore的記錄,因此如果您只做了HIGHER THAN,那麼您的WHERE子句只需要掃描這些記錄而不是整個400,000條記錄。
不可能沒有進一步的信息說。你有訪問主機嗎?它是否仍然響應? mysqld進程仍在運行嗎? 'scorelist'和'Users'表中有多少條記錄?你有'Users.UserId'和'(scorelisting.UserId,scorelisting.AverageScore)'索引嗎? – eggyal
你有400.000用戶嗎?看起來如此,如果你有400.000的平均分數。這真的很多人。如果你有這麼多的用戶,也許你不應該實時計算排名,但讓一份工作重新計算所有用戶的排名並將其存儲在AvarageScore表中。您可以每小時更新一次排名。 – GolezTrol
@eggyal,因爲我說400.000行兩個表。我沒有訪問機器我使用瀏覽器來連接mysql服務器,但現在我甚至無法打開服務器列表(這是我的面板的開始屏幕)我沒有Indexes現在因爲我想平衡mssql mysql表(這是我認爲沒有主題) –