2012-07-30 72 views
5

我想一次獲取我的結果作爲'頁面';我希望頁碼是一個參數(在JDBC準備語句中)。請看下面的代碼片段使用LIMIT爲MySQL查詢中的結果分頁

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語法錯誤;檢查 對應於你的MySQL服務器版本使用附近的正確語法手冊「((1 - 1)* 20),20」在行1

我在做什麼毛病我LIMIT條款,我該如何解決它?

回答

7

MySQL需要用於該LIMIT語法的數字常量。

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

LIMIT子句可以被用來限制SELECT語句返回的行數。 LIMIT取一個或兩個數字參數,它必須都是非負整數常數,但以下情況除外:

  • 內編制報表,極限參數可以使用指定?佔位符標記。

  • 在存儲的程序中,可以使用整數值例程參數或局部變量來指定LIMIT參數。

計算在Java方面的常數。

+1

所以不能評價'((1-1)* 20)'爲常數,即使它包含什麼,但常數?這似乎是一個奇怪的限制。我認爲它被認爲是一個常量,因爲它沒有變量......但至少我知道現在該做什麼!謝謝。 – corsiKa 2012-07-30 20:20:06

+0

是的,從數學上講,你代表一個「常量」((1-1)* 20總是相同的)..但從解析器的角度來看,MySQL並不處於數學表達式解析的心情:) – Matt 2012-07-30 20:22:03

+2

我用'limit?,20'和'pageStart =(page - 1)* 20'替換了違規代碼,並且它像一個魅力一樣工作。現在到下一個bug :) – corsiKa 2012-07-30 20:28:58

11

這是無法完成的。

見這裏的解決方案: MySQL Math and COUNT(*) in LIMIT

我會建議使用JavaScript或東西來處理的第一個參數(即偏移),如: limit 0,20第一頁上,limit 21,20在第二...

對於例如,如果您的第一頁在網址中有一個get變量www.example.com?page=1

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

最好你會使用這樣的東西。該代碼比兩個查詢要快得多,因爲您需要對錶進行計數,然後使用該計數結果作爲新參數,因爲表中有n行的潛在可能性...表越大,表越少高效的查詢將是。 – Shawn 2012-07-30 20:11:32

4

定義偏移量查詢。

例如

,如果你想偏置頁面-1(記錄1-10)

= 0,限制= 10;對於第2頁(記錄11-20),offset = 20,limit = 10;並使用以下查詢:

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

例如:

SELECT column FROM table 
LIMIT 10 OFFSET 10;