2012-11-25 46 views
0

我用這個查詢,我認爲MySQL服務器崩潰或什麼的。現在無法達到。這是巧合還是我的查詢太糟糕了?如果它壞我該如何解決MySql查詢示例

工作400.000行2代表一個scorelisting等是用戶

SELECT a.* 
from 
(
    SELECT @curRank := @curRank +1 AS ROW , s.UserId, 
     s.AverageScore As Score, u.UserName 
    FROM scorelisting s, (SELECT @curRank :=0) r, Users u 
    where u.UserId=s.UserId 
    order by AverageScore desc 
) a 
where UserId = 95890 
+0

不可能沒有進一步的信息說。你有訪問主機嗎?它是否仍然響應? mysqld進程仍在運行嗎? 'scorelist'和'Users'表中有多少條記錄?你有'Users.UserId'和'(scorelisting.UserId,scorelisting.AverageScore)'索引嗎? – eggyal

+0

你有400.000用戶嗎?看起來如此,如果你有400.000的平均分數。這真的很多人。如果你有這麼多的用戶,也許你不應該實時計算排名,但讓一份工作重新計算所有用戶的排名並將其存儲在AvarageScore表中。您可以每小時更新一次排名。 – GolezTrol

+0

@eggyal,因爲我說400.000行兩個表。我沒有訪問機器我使用瀏覽器來連接mysql服務器,但現在我甚至無法打開服務器列表(這是我的面板的開始屏幕)我沒有Indexes現在因爲我想平衡mssql mysql表(這是我認爲沒有主題) –

回答

2

我不知道我是不是囫圇吞棗這一點,但...如果您正在尋找特定用戶在其他人的排名之內,我會找出該人的「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條記錄。

+0

解決方案看起來很酷,但UserRank總是1 –

+0

@MertMermi,修改併發布了SQLFiddle示例以顯示影響。即使我的原始查詢在我的機器上工作。 – DRapp

+0

對不起,延遲迴復,有點忙碌的日子。我只是嘗試工作正常。非常感謝:)聰明的解決方案 –