web-dev-qa-db-ja.com

LIMITを使用して、MySQLクエリの結果をページ分割します

結果を一度に「ページ」で取得したい。ページ番号をパラメーターにしたい(JDBCプリペアドステートメント内)。次のスニペットを検討してください

SELECT * FROM thread t ORDER BY t.id LIMIT ((? - 1) * 20), 20

したがって、理想的には、これにより、1ページ目でLIMIT 0, 20

私がテストするとき

SELECT * FROM thread t ORDER BY t.id LIMIT ((1 - 1) * 20), 20

構文エラーがあると言われました。しかし、それが何であるかはわかりません-それは単なる数学です。それが私に言うのは

エラー1064(42000):SQL構文にエラーがあります。 1行目の '((1-1)* 20)、20'の近くで使用する正しい構文については、MySQLサーバーのバージョンに対応するマニュアルを確認してください。

LIMIT句のどこが間違っていますか?どうすれば修正できますか?

6
corsiKa

MySQLでは、そのLIMIT構文に数値定数が必要です。

から http://dev.mysql.com/doc/refman/5.7/en/select.html

LIMIT句を使用して、SELECTステートメントによって返される行数を制限できます。 LIMITは、次の例外を除いて、1つまたは2つの数値引数を取ります。これらは両方とも非負の整数定数でなければなりません。

  • プリペアドステートメント内で、LIMITパラメーターは?を使用して指定できます。プレースホルダーマーカー。

  • ストアドプログラム内では、LIMITパラメータは整数値のルーチンパラメータまたはローカル変数を使用して指定できます。

Java側の定数を計算します。

9
Matt

これはできません。

ここで解決策を参照してください: MySQL Math and COUNT(*)in LIMIT

次のような最初のパラメーター(オフセットなど)を処理するには、JavaScriptなどを使用することをお勧めします。limit 0,20最初のページとlimit 21,202番目に.。

たとえば、最初のページのURLにget変数がある場合www.example.com?page = 1

offset = (page - 1)*20 ;
row_count = 20;
select * from table limit (offset, row_count);
13
Shawn

次の構文を使用してクエリのオフセットを定義します

SELECT column FROM table 
LIMIT {someLimit} OFFSET {someOffset};

たとえば、ページ#1(レコード1〜10)を取得するには、オフセットを0に設定し、制限を10に設定します。

SELECT column FROM table 
LIMIT 10 OFFSET 0;

ページ#2(レコード11〜20)を取得するには、オフセットを10に設定し、制限を10に設定します。

SELECT column FROM table 
LIMIT 10 OFFSET 10;
9
Prabodh Hend