2012-07-30 10 views
5

結果を一度に1ページずつ取り出したいと思います。私は、ページ番号を(JDBCプリペアドステートメントの)パラメータにしたい。 LIMIT 0, 20に、ページ1のために、理想的には、これはつながる次のスニペットLIMITを使用してMySQLクエリの結果をページ分割する

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

を考えてみましょう。私は

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

をテストする場合

私は構文エラーを持って聞いています。私はそれが何であるかは分かりませんが、それは単純な数学のことです。それはあなたに教えてくれます。

ERROR 1064(42000):あなたはSQL構文に誤りがあります。 が近くに使用する権利構文についてはMySQLサーバのバージョンに対応していること取扱説明書を確認してください「((1 - 1)* 20)、20」行では1

は、私は私のLIMIT句と間違って何をしていますどのように修正できますか?

答えて

7

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

http://dev.mysql.com/doc/refman/5.7/en/select.htmlから:LIMIT句は、SELECTステートメントによって返される行数を制限するために使用することができ

。 LIMITは、これらの両方の例外を除いて、非負整数定数でなければなりません1つのまたは2つの数値引数を取ります:準備された文の中で

  • を、LIMITパラメータを使用して指定することができますか?プレースホルダマーカー。

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

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

+1

ので、それは '((1-1)* 20)'それは何もなく、定数で構成されていても、定数として評価することはできません?それは奇妙な限界のようだ。私はそれが変数を含んでいないので、定数と見なされたと思った...しかし、少なくとも私は今何をすべきか知っています!ありがとう。 – corsiKa

+0

数学的に言えば、あなたは "定数"((1-1)* 20は常に同じです)を表していますが、パーサの観点からは、MySQLは数式表現解析の気分ではありません:) – Matt

+2

私は問題のコードを 'limit?、20'と置き換え、' pageStart =(page-1)* 20; 'を使って、それは魅力的に機能しました。今すぐ次のバグに:) – corsiKa

11

これはできません。ここ

参照ソリューション: MySQL Math and COUNT(*) in LIMIT

私は(すなわちオフセット)などの最初のパラメータを処理するためにjavascriptや何かを使用することをお勧めします:

については... 最初のページにlimit 0,20と第二のlimit 21,20

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

最適にあなたはこのようなものを使用します。コードは2つのクエリよりもはるかに高速です。テーブルのカウントを行い、その結果を新しいパラメータとして使用する必要があります。これは、テーブルのn個の行の可能性があるためです。効率的な照会が行われます。 – Shawn

4

がためにオフセットを定義www.example.com?page=1あなたの最初のページは、URLで取得する変数を持っている場合クエリ。例えば

あなたはページオフセット-1(レコードの1-10を)したい場合= 0、上限= 10;ページ2(レコード11-20)のオフセット= 20、限界= 10;そして次のクエリを使用します。

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

例:

SELECT column FROM table 
LIMIT 10 OFFSET 10; 
関連する問題