0

SQL結果がランダムに混ざったランダムな順序の応答を制限付きで返すことを考えています。問題は、基本的にグループ (行のチャンク) に分割された、すべての行を戻す必要があることです。私がはっきりしていることを願っています。

たとえば、テーブル A から:

ID   |   NAME    |   PROFESSION
++++++++++++++++++++++++++++++++
1    |  Jack     |   Carpenter
2    |  Rob      |   Manager
3    |  Phil     |   Driver
4    |  Mary     |   Cook
5    |  Tim      |   Postman
6    |  Bob      |   Programmer

クエリは次のようなものを返します。

0,2 の制限で:

6    |  Bob      |   Programmer
4    |  Mary     |   Cook

制限が 2,2 の場合:

1    |  Jack     |   Carpenter
5    |  Tim      |   Postman

制限が 4,2 の場合:

3    |  Phil     |   Driver
2    |  Rob      |   Manager

注: all the table rows were returned. 私のページには<< >>、必要なデータの「グループ」をユーザーに表示するボタンが必要です。このようなクエリを作成するにはどうすればよいですか?

4

4 に答える 4

2

説明した問題のより良い名前は、ランダムにシャッフルされたレコードです。順序がランダムであることは事実ですが、順序を記憶する必要があるため、列に保存するしかありません。これを行うには、ランダムに入力されたフィールドを保存し、それに基づいてレコードを並べ替えます。このようにして、将来の選択クエリのために順序が記憶されている間、特定の順序でレコードを並べ替えませんでした。順番に飽きたら、前述のフィールドを新しいランダムに生成された値で更新して、再びシャッフルすることができます。これは、プレーヤーが曲を 2 回再生せずにプレイリストをシャッフルするために使用する手法です。

[編集]

最初に与えられた解決策は一般的な答えですが、MySQL でレコードをランダムに並べ替えるために使用できるハックがあります。このように、順序を記憶するために保存する必要があるのはそのシードだけです。

SELECT * FROM tbl ORDER BY RAND(s);

たとえば、各ユーザーに異なるランダムな順序でレコードを表示する場合は、user_id をシードとして使用できます。このようにして、各ユーザーがレコードを表示する順序は同じままですが、ランダムで他のユーザーとは異なります。

于 2012-07-25T06:35:18.960 に答える
0

ここで、次の 2 つのことが考えられます。

  1. テーブル内のデータが膨大な場合は、行が属するグループを示す列を追加します。ユーザーが >> または << ボタンをクリックすると、その特定のグループの行が取得されます。

  2. 少量のデータを扱っている場合は、コード自体でこれを行うことができます。

于 2012-07-25T06:18:31.443 に答える
0

random_colのような名前のテーブルに列を追加します

次に、実行するテーブルをランダム化する必要があるたびに

UPDATE table SET random_col = RAND()

そして、結果を取得するたびに、通常の選択を実行します

SELECT * FROM table ORDER BY random_col ASC LIMIT x,y

「UPDATE」を実行して再度ランダム化するまで、結果は同じ順序で表示されます。

于 2012-07-25T06:38:12.097 に答える
0

使用する場合はORDER BY RAND()、選択したレコードにフラグを立てる必要がありますが、これはお勧めできません。

たとえば、total_pagesとを組み合わせたインテリジェントなアルゴリズムを使用できます。ID

SELECT *
FROM  my_table
ORDER BY MOD(ID, total_pages);
于 2012-07-25T06:35:56.423 に答える