2008-11-01 86 views
87

我想構建一個查詢,顯示錶中的所有結果,但是從表的起始位置偏移5。據我所知,MySQL的LIMIT需要一個限制和一個偏移量。有沒有辦法做到這一點?Mysql偏移量無限行

+1

這是一個完全有效的問題,但我想知道最好是抓住一切,並以編程方式忽略頭幾個記錄。鑑於似乎是最好的答案(限制5,18446744073709551615)的恐怖,我非常喜歡解決MySQL的LIMIT的侷限性。 – cesoid 2015-01-31 02:31:10

+2

@cesoid如果你想要`限制5000,18446744073709551615`,該怎麼辦?你不會爲了你的代碼看起來漂亮而獲得額外的5000行。 – elipoultorak 2015-10-26 11:03:23

+0

@ user3576887我認爲你是對的,我只是在考慮上面的問題,假設5是唯一的要求,而不是一些可能更大的變化量(而不是解決別人的問題)。 – cesoid 2015-10-28 14:29:52

回答

124

MySQL Manual on LIMIT

檢索所有行從某個 偏移到最後的結果 集合中,可以使用一些大數目作爲 的第二個參數。這種說法 檢索的所有行第96列 到最後:

SELECT * FROM tbl LIMIT 95, 18446744073709551615; 
+83

太可怕了!我來到了這裏,希望MySQL能夠使Limit的條款成爲可選的,但是也提供了偏移量......但不是! 我已經看到了這個18446744073709551615遍佈整個代碼,我在指責懶惰的程序員,但它是一個設計特徵! – Petruza 2010-05-24 15:10:02

+7

awfull答案,但多數民衆贊成在官方從MySQL文件。我可以說@ _ @ – GusDeCooL 2011-10-19 18:06:53

+16

18446744073709551615對於那些想知道的人來說是2^64-1。您可能需要小心,因爲您無法將此值存儲在32位整數中。您必須確保將其存儲爲字符串以確保兼容性。 – AlicanC 2011-12-07 22:51:51

17

至於你提到它限制是必需的,所以你需要使用的最大極限可能,這是18446744073709551615(最大無符號BIGINT的)

SELECT * FROM somewhere LIMIT 18446744073709551610 OFFSET 5 
+24

哇,這是MySQL團隊的官方解決方案嗎? – Antony 2011-05-23 18:11:16

3

另一種方法是選擇一個autoimcremented列,然後使用具有過濾。

SET @a := 0; 
select @a:[email protected] + 1 AS counter, table.* FROM table 
HAVING counter > 4 

但是我可能會堅持使用高限制方法。

0

就在今天,我正在閱讀有關從mysql表中獲取大量數據(超過一百萬行)的最佳方法。一種方法是,如所暗示的那樣,使用LIMIT x,y,其中x是偏移量,而y是您想返回的最後一行。但是,正如我發現的那樣,這不是最有效的方式。如果您有一個自動增量列,可以輕鬆使用SELECT聲明和WHERE子句聲明要從哪條記錄開始。

例如, SELECT * FROM table_name WHERE id > x;

看來,當您使用LIMIT,MySQL的獲取所有結果,然後只能說明你適合在記錄偏移:沒有最好的性能。

來源:對此問題的回答MySQL Forums。請注意,問題是大約6歲。

-1

我知道這是舊的,但我沒有看到類似的迴應,所以這是我將使用的解決方案。

首先,我會對錶執行計數查詢以查看存在多少記錄。這個查詢很快,通常執行時間可以忽略不計。喜歡的東西:

SELECT COUNT(*) FROM table_name; 

然後,我會用我的數了我的極限結果建立我的查詢(因爲這是行的最大數目表可能可能返回)。喜歡的東西:

SELECT * FROM table_name LIMIT count_result OFFSET desired_offset; 

或者可能是這樣的:

SELECT * FROM table_name LIMIT desired_offset, count_result; 

當然,如果有必要,你可以從count_result減去desired_offset得到一個實際的,精確值提供爲限。如果我真的可以確定提供的適當限制,傳遞「18446744073709551610」值就沒有意義。

-5
WHERE .... AND id > <YOUROFFSET> 

ID可以是任何自動遞增或唯一的數字列你有...

-1

使用這種其他question和合並與格雷格的答案那招,你可以使用〜0而不是最大的無符號BIGINT值:

SELECT * FROM tbl LIMIT ~0 OFFSET 95; 

SELECT * FROM tbl LIMIT 95, ~0; 
0

可以使用MYS QL聲明與極限:

START TRANSACTION; 
SET @my_offset = 5; 
SET @rows = (SELECT COUNT(*) FROM my_table); 
PREPARE statement FROM 'SELECT * FROM my_table LIMIT ? OFFSET ?'; 
EXECUTE statement USING @rows, @my_offset; 
COMMIT; 

在MySQL 5.5.44測試。因此,我們可以避免插入數字18446744073709551615.

注意:事務可以確保變量@rows與執行語句時考慮的表格一致。

6

正如在其他答案中指出的那樣,MySQL建議使用18446744073709551615作爲限制中的記錄數,但請考慮:如果您獲得18,446,744,073,709,551,615條記錄,您會做什麼?事實上,如果你有10億條記錄,你會怎麼做?

也許你確實想要超過10億條記錄,但我的觀點是,你想要的數量有一些限制,它要小於18十億分之一。爲了穩定性,優化和可用性,我建議在查詢中加入一些有意義的限制。這也可以減少任何人從未見過神奇數字的困惑,並且至少能夠傳達您願意同時處理多少條記錄的額外好處。

如果你真的必須從你的數據庫中得到所有18條記錄,也許你真正想要的是以1億的增量抓取它們並循環1840億次。