2012-10-27 64 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

我不能提出限制,如果提取的玩家不可用,该怎么办?我必须向他展示下一个可用的球员。 –