【问题标题】:Mysql Select query - not able to limit recordsMysql Select查询 - 无法限制记录
【发布时间】:2012-10-28 02:37:37
【问题描述】:

我有一个排名表,其中包含所有玩家的排名。

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 由超级管理员设置。如果 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”记录。我怎么能限制这个?最大的问题是我需要按升序显示排名。在这里使用订单并不容易。

【问题讨论】:

  • 如果某人不可用,是否还需要另一个 where 子句 where "is_available = 1"?
  • 如果我这样做了,我不会得到不可用的球员。我必须向他们展示为什么要给他一个额外的球员。他们可以是 3 名不可用的球员。所以应该给他第四名。
  • 好吧,只是不是 100% 被问到什么,所以我想我会澄清
  • 当然。如果我描述性不够,请告诉我。我会尝试再次解释。

标签: php mysql


【解决方案1】:

首先通过执行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 上查看(包括确定要选择的用户数量)。

【讨论】:

  • 非常感谢您的努力。这适用于所有条件。唯一缺少的是最后一个 where 子句,其中ranking_id = 1。这很好用。非常感谢。 +1 并勾选您的答案。
【解决方案2】:

尝试在查询末尾添加 LIMIT 1 或 LIMIT 0, 1(开始,多少条记录)

【讨论】:

  • 我无法设置限制,如果获取的播放器不可用怎么办?我必须向他展示下一个可用的球员。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多