2

MySQL データベースのスコアのリストからランクを受け取り、それを iPhone に送信しようとしています。iPhone に値を送信する方法は知っていますが、データベース内のスコアのリストからランクを取得することは、今のところ私の能力を超えています。

「ユーザー名が指定されたときに、順序付けられていないMySqlデータベースからスコアに基づいてランクを取得する」と「MySQLはORDER BYで行の位置を取得する」を調べ、2番目のリンクのソリューションを使用して自分の答えを見つけようとしました。しかし、それはまだそれをカットしていません。

私の 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:

| | ID | スコア | ランク |
----------------------
| | 3 | 3212 | 1 |
| | 1 | 2313 | 2 |
| | 2 | 1923年 | 3 |

出力例WHERE score = 1923:

| | ID | スコア | ランク |
----------------------
| | 2 | 1923年 | 3 |

これがSQLFiddleのデモです

于 2013-08-25T08:56:14.920 に答える