1

次のようなテーブルがあります

 ID |value
 --------
 1  |  10
 --------
 2  |  30
 --------
 3  |  20
 --------
 4  |  20
 --------
 5  | 10 
 --------

降順で並べ替え、LIMIT を使用して最初の 2 行を選択しました。

したがって、選択クエリは次を返します。

 --------
 2  |  30
 --------
 3  |  20
 --------

ここで、同じソート方法で 2 番目の 2 行を選択したいので、結果は次のようになります。

 --------
 4  |  20
 --------
 1  |  10
 --------

これどうやってするの ?

クエリは動的クエリである必要があり ます。つまり、これらの 2 つの行を選択した後、次の 2 つの行を選択する必要があり、テーブルの最後まで同様です。

重要な宣言

クエリは、前の選択から最後の ID を取得し、次の 2 つを自動的に生成する必要があります。申し訳ありませんが、初めて質問を投稿したときに言い忘れました。

4

3 に答える 3

2

節の次のOFFSET部分を使用できます。LIMIT

LIMIT 2 OFFSET 2;

これにより、指定されたオフセットの後 (この場合は 2 行目以降) から始まる結果を制限できます。

UPDATE (動的クエリ?)
select/offset を動的にするには、その部分を PHP で処理する必要があります。レコードを引っ張ってきて、それらで何かをして、次のセットを引っ張っていると思いますか? これが正しければ、実行した反復回数のカウンターを保持できます。

$offsetCounter = 0;
// start your loop, based on whatever you need (for, while, etc.)
    $limit = 'LIMIT 2 OFFSET ' . (2 * $offsetCounter++);
    // append `$limit` to the end of your query
    $query = 'SELECT ID, value FROM yourTable ORDER BY value DESC ' . $limit;

UPDATE #2 (動的クエリ、なしOFFSET)または少なくともカウンターを使用して実装することは
できませんが、取得した最後のレコードの ID を使用できる場合は、それを句に追加できます (並べ替えもお勧めしますその場合は ID フィールドによっても)。OFFSETWHERE

次のようなものが機能するはずです(必要に応じて、準備済みステートメントを使用するように更新してください):

$lastIdSelected = 0;
// start your loop
    $query = 'SELECT ID, value FROM yourTable';
    $query .= (($lastIdSelected != 0) ? ' WHERE id > ' . $lastIdSelected : '');
    $query .= ' ORDER BY value DESC, id ASC LIMIT 2';
    // execute query, do your work, etc.

    // on your last record, do:
    $lastIdSelected = $row['ID'];

もちろん、これもOFFSET変数を使用した最初の更新の形式に従います。これを変更して、最後の ID を格納するために一時変数を使用しないようにすることもできますが、どちらの方法でも同じ量の作業になる可能性があります。

于 2012-10-22T20:03:10.860 に答える
2

使用するLIMIT 2, 2

LIMIT について詳しくは、http: //php.about.com/od/mysqlcommands/g/Limit_sql.htmをご覧ください。

于 2012-10-22T20:02:51.037 に答える
1
于 2012-10-22T20:06:14.210 に答える