1

私は MySQL 構文の初心者です。そこでいくつか質問したいことがあります。

ユーザーが手がかりを追加できる手がかり DB を取得しました。また、ランダム関数を実行するために数値の範囲を選択する webmethod があります。(ゲームのためにランダムなので、同じ手がかりを何度も繰り返しても意味がありませんよね?)

しかし、現在の私の主な問題は、著者がさらに手がかりを追加することを決定した場合はどうなるかということです. 次に、私の手がかりデータベースは次のようになります。

+--------+-------------+-----------+--------+
| cID    | clueDetails |  location | author |
+--------+-------------+-----------+--------+
|   1    |      abcde  |   loc 1   | auth 1 |
|   2    |      efghi  |   loc 1   | auth 1 |
|   3    |      jklmno |   loc 2   | auth 1 |
|   4    |      pqrstu |   loc 2   | auth 1 |
|   5    |      vwxyz  |   loc 1   | auth 1 |
+--------+-------------+-----------+--------+

プレーヤーがloc1auth 1を選択すると、 が表示されcID 1,2 and 5ます。そのため、loc と auth の最初と最後を選択し、3 と 4 が収まらないため、ランダム関数を効果的に使用できませんでした。そして、プロセス全体を実際に理解するには、ゲームと、私が持っている方法/機能にまで行きます. (非常に長くなります)

突き詰めると、私の結果は以下のようになり、それを識別する方法はcIDになりますが、手がかりが別の順序で追加された場合(上記のように)、私の関数はかなり台無しになります。

編集:このランダム関数が2つの手がかりを返すと仮定すると、2つの手がかりを再生したいからです。このランダム関数は 1 と 3 を返します。したがって、以下の表の結果から、1 と 3 は行番号 1 と 3 であるため、cID1 と cID5 を返します。(混乱を招いて申し訳ありません)

+--------+-------------+-----------+--------+
| cID    | clueDetails |  location | author |
+--------+-------------+-----------+--------+
|   1    |      abcde  |   loc 1   | auth 1 |
|   2    |      efghi  |   loc 1   | auth 1 |
|   5    |      vwxyz  |   loc 1   | auth 1 |
+--------+-------------+-----------+--------+

それでは、番号で行を選択できるかどうかお尋ねしたいと思います。例えばrow[3] = cID 5, vwxyz, loc 1, auth 1

私に関する限り、大規模な調査を行いましたが、MySQL には行番号で選択できる機能はないようです。(ただし、すべての記事は 2010 年以前のかなり古いものでした。MySQL が新しい機能を追加したかどうかはわかりません)

私はSOスレッドを見ました - MySQL - 選択時に行番号を取得し、私がそれを見る方法から、ランキングと呼ばれるフィールドを生成しているようです。

私が知りたいのは、このフィールドはranking一時的なものですか、それとも永続的なものですか? それが単なる一時フィールドであれば、識別子を cID からこの番号付けに変更できるからです。

または、この問題を解決するための提案はありますか? データベースをクリアして、データベースを再作成することを考えましたが、時間がかかりすぎます。また、DB が大きくなると、時間の経過とともに遅くなります。もう 1 つの方法は、loc=?loc と auth=?auth の現在の手がかりをすべて埋めるデータテーブルを作成し、それらを新しい手がかり (最新) で再度追加することですが、これにより cID が急上昇し、飛んでしまうと考えています。非常に速い速度。そして、これがメモリ管理の問題/メモリリークを引き起こすのではないかと心配しています。

EDIT2:作成フィールドは単なる一時フィールドであり、唯一の代替手段のように思われるため、この MySQL コマンドを試しました。

set @rank=0;
select @rank:=@rank+1 AS rank, cId, clueDetails, location, author from tbl_clue where location = "loc" and author = "auth" order by rank ASC

私が望むものを表示しているように見えますが、私のコマンドは他の通常のコマンドとは異なっているようです。(より多くのブラケットやその他のもの)。私のコマンドは大丈夫ですか?それによって引き起こされる間接的な影響はありますか?

4

2 に答える 2

2

これを試すことができます。これが役立つ場合は、コメントを追加してください:)

SELECT     cID, clueDetails, location, author
FROM
   (
      SELECT    @rownum := @rownum + 1 as `RowNo`, 
                p.cID, 
                p.clueDetails, 
                p.location, 
                p.author 
        FROM (
               SELECT cID, clueDetails, location, author
                 FROM myTableName
                WHERE location = 'loc 1' AND author = 'auth 1'
             ) p , (SELECT @rownum:=0) r 
    ) y
WHERE y.RowNo = 3
ORDER BY RowNo
于 2012-07-20T08:19:39.933 に答える
0

私があなたを正しく理解しているかどうかはわかりませんが、最終的に次のようになると仮定します。

+--------+-------------+-----------+--------+
| cID    | clueDetails |  location | author |
+--------+-------------+-----------+--------+
|   1    |      abcde  |   loc 1   | auth 1 |
|   2    |      efghi  |   loc 1   | auth 1 |
|   5    |      vwxyz  |   loc 1   | auth 1 |
+--------+-------------+-----------+--------+

3 つのレコードではなく、ランダムに 1 つのレコードのみが必要な場合は、次のようにします。

$query = "THE QUERY";

if ($result = $dbc->query($query))
{
    $num_rows = mysql_num_rows($result);

    $random_number = rand(1, $num_rows);

    $count = 1;

    while($nt = $result->fetch_assoc())
    {
       if ($count = $random_number)
       {
           //SAVE THE CLUE DETAILS
       }

       $count = $count + 1;
    }
}
于 2012-07-20T08:22:39.393 に答える