我有一个排名表,其中包含所有玩家的排名。
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 由 super 管理员设置。如果x = 10,则玩家“testname4”可以挑战(ranking_id中的玩家数量* 10/100)= 4 * 10/100 = 0.4四舍五入到1。因此testname4可以挑战比他高一号的玩家。但他上面的播放器“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”记录。我该如何限制这个?最大的问题是我需要按升序显示排名。在这里使用 order 并不容易。
最佳答案
首先通过执行SELECT ... WHERE is_available = 1 ORDER BYrank 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 .
关于php - Mysql Select 查询 - 无法限制记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13102664/