2

我正在尝试从 MySQL 数据库中的分数列表中接收排名并将其发送到 iPhone。我知道如何向 iPhone 发送一个值,但是从数据库中的分数列表中获得排名现在几乎超出了我的能力。

我研究了“在给定用户名时从无序的 MySql 数据库中获取排名,基于分数”和“ MySQL 在 ORDER BY 中获取行位置”并使用第二个链接的解决方案来尝试提出我自己的答案,但它还没有削减它。

在我的 php 文件中,我收到分数、用户名 (uname)、用户设备 ID (udid) 并使用 $_POST 并将其输入到我的高分数据库中。插入分数后,我尝试通过查看分数并找到正确的“位置”作为排名来查找用户的排名。

我的代码是:

$rank = 0;
$stmt = $this->db->prepare('SELECT t.id, (SELECT COUNT(*) FROM high_score_4 WHERE score<=t.score) AS position t.score FROM TABLE t WHERE t.score=?');
$stmt->bind_param("i",  $score);
$stmt->execute();
$stmt->bind_result($rank);
while($stmt->fetch()){
     break;
}
$stmt->close();
echo "rank is : " . $rank . "\r\n";

这是我很困惑的准备语句。我什至不确定我是否正确理解了其他帖子的答案......尤其是 t.id 和 TABLE t 部分

我对所有 PHP 和 MySQL 的东西都很陌生,所以我的代码很可能很忙而且从根本上说是错误的,但我相信有经验的眼睛可能会立即看出我的代码有什么问题,任何帮助将不胜感激!

这是我的 high_score_4 表的表结构:

+----+-------+------------+------------------+
| id | score | uname      | udid             |
+----+-------+------------+------------------+
|1   |  2313 | one        |device-one        |
|2   |  1923 | two        |device-two        |
|3   |  3212 | three      |device-three      |
+----+-------+------------+------------------+

CREATE TABLE high_score_4 (
    id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
    score mediumint NOT NULL,
    uname varchar(255) NOT NULL,
    udid varchar(255) NOT NULL,
    puzzles tinyint NOT NULL,
    multiplier tinyint NOT NULL,
    oneshots tinyint NOT NULL,
    hints tinyint NOT NULL,
    time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

所以如果我寻找2313的分数,我想获得排名2。我不需要其他任何东西!

提前致谢!

感谢彼得的帮助,问题解决了!这是新代码:

$stmt = $this->db->prepare('SELECT rank FROM(SELECT id, score, @n := IF(@g = score, @n, @n + 1) rank, @g := score FROM high_score_4, (SELECT @n := 0) i ORDER BY score DESC)q WHERE score=?');
$stmt->bind_param("i",  $score);
$stmt->execute();
$stmt->bind_result($rank);
while($stmt->fetch()){
     break;
}
$stmt->close();
echo "rank is : " . $rank . "\r\n";

并且排名正确打印!感谢大家的帮助!

4

2 回答 2

6

尝试

SELECT id, score, rank
  FROM
(
  SELECT id, score, @n := IF(@g = score, @n, @n + 1) rank, @g := score
    FROM high_score_4, (SELECT @n := 0) i
   ORDER BY score DESC
) q
 -- WHERE score = 1923

不带的示例输出WHERE

| 身份证 | 分数 | 排名 |
---------------------
| 3 | 3212 | 1 |
| 1 | 第2313章 2 |
| 2 | 1923 | 3 |

示例输出WHERE score = 1923

| 身份证 | 分数 | 排名 |
---------------------
| 2 | 1923 | 3 |

这是SQLFiddle演示

于 2013-08-25T08:56:14.920 回答
0

我建议在 sql 中使用内置的 RANK 函数。这会对分数进行排序,并在 sql 输出中放置一个带有排名数字的额外列。更多信息可以在这里找到http://technet.microsoft.com/en-us/library/ms189798.aspx

于 2013-08-25T09:02:24.590 回答