2011-08-18 31 views
0

我已經制定了像這樣的表:找出特定行的行數,通過一筆訂貨後

wins(userid, wins, losses) 

我運行像這樣的查詢命令表:

SELECT winloss.userid AS userid, 
(winloss.wins*3) - winloss.losses AS winloss 
FROM site_win_loss AS winloss WHERE winloss.userid 
NOT IN (0, 1, 2, 3, 4, 5, 26, 32, 46, 90) ORDER BY winloss DESC 

這樣做是爲每個用戶分配他們的分數,並以排行榜的形式對他們進行排序。現在,在我的實際執行我用一個簡單的PHP計數放置1,2,3 ECT有名稱旁邊,但我知道,我也可以這樣做:

SELECT @rownum:[email protected]+1 as rank, 
winloss.userid AS userid, 
(winloss.wins*3) - winloss.losses AS winloss 
FROM site_win_loss AS winloss, 
(select @rownum:=0) a 
WHERE winloss.username NOT IN (0, 1, 2, 3, 4, 5, 26, 32, 46, 90) 
ORDER BY winloss DESC 

現在,讓我們說,上述返回我以下內容:

rank | userid | winloss 
1  | 45  | 657 
2  | 54  | 587 
3  | 26  | 501 
4  | 76  | 532 
5  | 34  | 476 
6  | 63  | 412 
7  | 23  | 367 
8  | 84  | 314 
9  | 41  | 265 
10 | 96  | 201 

有沒有反正我可以抓住上面的特定行?例如,如果我想JUST用戶41的細節上面的SQL語句將返回僅此:

rank | userid | winloss 
9  | 41  | 265 

在此先感謝

回答

1

我可能是誤會,但假設你從上面產生的表查詢,爲什麼不能簡單地使用簡單的select/where語句來查詢該表以獲取指定的記錄?例如,

select * 
from #ranktable 
where userid = 41 
+0

我將如何執行在查詢內我已經運行? –

+0

我想象着你將嵌套上面以創建一個臨時/永久表。 如果這不是您的計劃,您可以將上述內容全部放入子查詢中,並使用上面包含的查詢獲取您想要的記錄: 從([您上面的查詢]中選擇* )一個 其中a.userid = 41 – Chris

+0

是的,就是這樣。我認爲當時我認爲(看起來不正確)我可以用一些聰明的WHERE條件來做到這一點。只要我點擊它,我就會給你打勾。你首先到達那裏。 –

1

使用一個外部查詢

Select * 
FROM(
SELECT @rownum:[email protected]+1 as rank, 
winloss.userid AS userid, 
(winloss.wins*3) - winloss.losses AS winloss 
FROM site_win_loss AS winloss, 
(select @rownum:=0) a 
WHERE winloss.username NOT IN (0, 1, 2, 3, 4, 5, 26, 32, 46, 90) 

)a 
where a.userid = 41 
+0

就是這樣。我實際上有點不高興,因爲我花了這麼長時間寫出這麼大的問題,哈哈哈。一個非常小的觀點。我必須在結束括號後加上「AS temp」,因爲它拒絕運行沒有別名。我認爲當時我認爲(看起來不正確)我可以用一些聰明的WHERE條件來做到這一點。 –

1

,如果沒有使用子查詢工作(但未必真的是任何更有效)的另一種選擇,是使用HAVING子句。

喜歡的東西:

SELECT @rownum:[email protected]+1 as rank, 
    winloss.userid AS userid, 
    (winloss.wins*3) - winloss.losses AS winloss 
FROM site_win_loss AS winloss, 
    (select @rownum:=0) a 
WHERE winloss.username NOT IN (0, 1, 2, 3, 4, 5, 26, 32, 46, 90) 
HAVING rank = 9 
ORDER BY winloss DESC 

然而,這在新的輸出重新計算排名的令人失望的結果,但它應該給你你想要的記錄。

編輯:移動了HAVING的位置。

+0

假設一張桌子上有成千上萬的用戶(雖然到那時我只會在cron中每小時計算一次並緩存它),這會更有效率嗎?我想盡可能延遲緩存,因爲我認爲用戶往往會注意到它。 –

+0

在對一張表進行測試時,我有270,000條記錄,我發現上面的'HAVING'語句在0.12秒內返回,而子查詢方法在0.26秒內返回。 –

+0

這裏是我的兩個查詢: '選擇@rownum:= @ ROWNUM + 1等級, u.uid AS用戶ID, u.access AS winloss 來自用戶的鈾, (選擇@rownum:= 0) (0,1,2,3,4,5,26,32,46,90) ORDER BY winloss DESC HAVING rank = 9; SELECT * FROM ( SELECT @rownum:= @ ROWNUM + 1作爲秩, u.uid AS的userid, u.access AS winloss FROM用戶爲u, (選擇@rownum:= 0)一 WHERE u.uid NOT IN(0,1,2,3,4,5,26,32,46,90) ORDER BY winloss DESC )x WHERE rank = 3;' –