2012-10-27 118 views
0

我有一個排名表,其中我擁有所有玩家的排名。Mysql Select查詢 - 無法限制記錄

id | rank | playername | is_available | ranking_name | ranking_id 
------------------------------------------------------------------- 
1 | 1 | testname1 |  1  | australia open | 1 
2 | 2 | testname2 |  1  | australia open | 1 
3 | 3 | testname3 |  0  | australia open | 1 
4 | 4 | testname4 |  1  | australia open | 1 
5 | 1 | testname5 |  1  | japan open  | 2 

這個表是巨大的,並且對於每個ranking_id,可以有超過500個玩家。 現在,每位球員都可以向上級球員挑戰比賽數量x%。這個x由superadmin設置。如果x = 10,玩家「測試名稱4」可以挑戰(排名_id * 10/100中的玩家數量)= 4 * 10/100 = 0.4回合爲1,因此測試名稱4可以挑戰位於他之上的一個玩家。但他的上面的球員「testname3」不可用。所以他應該得到下一個可用的球員。我希望輸出像

//testname4 can challenge below players 

id | rank | playername | status  | 
-------------------------------------- 
2 | 2 | testname2 | available | 
3 | 3 | testname3 | not available | 

我做了什麼:

//testname4 wants to challenge. So i know his rank and other information 

$selectSql = mysql_query("SELECT * from rankingTable where ranking_id = 1 AND rank < 4"); 

這是給我的 「testname1」 記錄爲好。我怎麼能限制這個?而最大的問題是我需要以升序顯示排名。使用這裏的命令並不容易。

+0

您是否需要另一個where子句,其中「is_available = 1」以及某人不可用? – TommyBs

+0

如果我這樣做,我不會得到沒有的球員。我必須向他們展示他爲什麼被賦予額外的球員。他們可以是3名不可用的球員。所以他應該給予第四名球員高於他。 –

+0

好吧,只是不是100%被問到的東西,所以我想我會clarufy – TommyBs

回答

2

首先確定到底用戶能夠通過執行SELECT ... WHERE is_available = 1 ORDER BY rank DESC LIMIT ?的挑戰,然後採取MIN(rank)找到最高排這樣的用戶,然後使用該信息來過濾表給用戶自己和該用戶之間的排名:

SELECT rankingTable.* 
FROM  rankingTable, (
    SELECT MIN(a_rank) AS lower, b_rank - 1 AS upper 
    FROM (
    SELECT a.rank AS a_rank, b.rank AS b_rank 
    FROM  rankingTable AS a JOIN rankingTable AS b USING (ranking_id) 
    WHERE ranking_id = ? 
     AND b.playername = ? 
     AND a.rank < b.rank 
     AND a.is_available = 1 
    ORDER BY a.rank DESC 
    LIMIT ? 
) AS ranks 
) AS limits 
WHERE rank BETWEEN limits.lower AND limits.upper 
ORDER BY rank DESC 

看到它(包括確定用戶的數量的要被選擇)上sqlfiddle

+0

我真的很感謝你的努力。這適用於所有條件。唯一缺少的是最後一個where子句,其中ranking_id = 1。這很好。非常感謝。 +1並勾選您的答案。 –

+0

呃,傻我。好地方! – eggyal

0

嘗試只是增加LIMIT 1或LIMIT 0,1(開始時,有多少記錄)查詢

+0

我不能提出限制,如果提取的玩家不可用,該怎麼辦?我必須向他展示下一個可用的球員。 –