从使用 PHP 的 MySQL 数据库到 iPhone 的分数列表中获取排名

Posted

技术标签:

【中文标题】从使用 PHP 的 MySQL 数据库到 iPhone 的分数列表中获取排名【英文标题】:Get a rank from list of scores from MySQL database using PHP to an iPhone 【发布时间】:2013-08-25 07:58:20 【问题描述】:

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

我研究了“Get a rank, based on score, from an unordered MySql Database when given a Username”和“MySQL get row position in 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。我不需要其他任何东西!

提前致谢!

在 Peter 的帮助下问题解决了! 这是新代码:

$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";

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

【问题讨论】:

你能发布你的表结构吗?它会更容易帮助你。最好在 DDL(创建表语句)中。 您是否遇到任何错误SELECT t.id, (SELECT COUNT(*) FROM high_score_4 WHERE score&lt;=t.score) AS position t.score FROM TABLE t WHERE t.score=? 是否需要在positiont.score 之间添加一个“,”坦率地说我有点困惑 @Ruben 感谢您的调查!我不确定 DDL,但我更新了表结构!有更多的列,但它们对于排名来说是不必要的 @skv 我无法在终端中显示错误..所以我完全不知所措...(我真的是 php 的菜鸟...)我不完全知道"," 在那里做什么,但在这个例子中 [link] (***.com/questions/3614666/…) 它有一个逗号,所以我只是使用它...感谢您查看它! 【参考方案1】:

试试

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演示

【讨论】:

天啊,彼得,你是我的英雄!工作完美!非常感谢!【参考方案2】:

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

【讨论】:

很遗憾 MySQL 不支持分析函数。

以上是关于从使用 PHP 的 MySQL 数据库到 iPhone 的分数列表中获取排名的主要内容,如果未能解决你的问题,请参考以下文章

从使用 PHP 的 MySQL 数据库到 iPhone 的分数列表中获取排名

PHP 使用PHP从Twitter搜索API到MySQL数据库保存推文

PHP如何使用laravel 5将数据从数组保存到mysql

使用 JSON 和 PHP 从 Mysql DB 获取数据到 listView

MySQL 数据从 PHP 到带有 JSON 的 Javascript

将用户输入从文本框插入到数据库(使用 mysql 的 PHP 到 PHPMYADMIN)代码由于某种原因不起作用