2012-10-03 21 views
0

想象一下,你有一個1米的記錄表,你想限制搜索結果下來說10,000和不超過。那麼我該如何使用它?那麼,答案是使用限制條款。php分頁和限制條款的使用

例如

select recid from mytable order by recid asc limit 10000

這是要給我最後的10000條記錄進入此表。

到目前爲止沒有分頁。 但限制短語已被使用。

這將問題帶到下一個層次。

如果我想通過此記錄尋呼特定記錄集100一次記錄怎麼辦?由於limit短語已經是原始查詢的一部分,我如何再次使用它,這次是爲了照顧分頁?

如果該組織。查詢沒有限制條款開始,我會調整它作爲limit 0,100,然後調整它爲limit 100,100然後limit 200,100等等,而分頁需要它的過程。但在這個時候,我不能。

你幾乎認爲你會一個接一個地使用兩個限制短語 - 這是不行的。

limit 10000 limit 0,100肯定會出錯。

那麼這種特殊情況下的解決方案是什麼?

[編輯]

後,我張貼了這個問題,我意識到,在組織的極限10000。查詢變得毫無意義,一旦分頁程序進入。我有點困惑自己,儘管整個order by recid asc limit 10000是where子句的一部分。實際上,limit 10000部分在記錄集內容中沒有任何影響 - 除了將記錄集限制在要求的限制之外。所以,一旦分頁開始,保持10000的限制就沒有意義了。我很抱歉爲此浪費你的時間。 :(

+0

限制爲100並確保偏移量不大於9900 – Tchoupi

+0

最後,您希望在查詢返回的結果集中有多少條記錄? – raina77ow

+0

對所有人:我想我的問題有一個邏輯謬誤。實際上,一旦分頁例程開始執行,組織查詢所達到的10000的限制就變得毫無意義了。記住,我得到了一個「limit 10000」開頭。我會在這個問題上加上這個觀察,以便我清楚地說明。 –

回答

1

我想說擺脫第一個限制,然後不要打擾做一個表的計數,或採取計數和你的極限,即10000的較小者,並根據這個做分頁。

$perpage = 100; 
$pages = $totalcount/$perpage; 
$page = $get['Page']; 
if($page > $pages || $page < 0) 
{ 
    $page = 0; 
} 
$limit = "LIMIT " . ($page * $perpage) . ", " . $perpage; 

要計算TOTALCOUNT,做

SELECT COUNT(*) FROM mytable 

然後檢查其對你的極限,即

if($totalcount > 10000) 
{ 
    $totalcount = 10000; 
} 

之所以要做一個專用計查詢,它需要非常少的DB來進行PHP數據傳輸,並且很多DBMS可以優化比較它們的垃圾o全表SELECT查詢。

+0

你如何計算$ totalcount?當發生分頁時,調整後的SQL就像'select recid from mytable order by recid asc limit 400,100'。在這種情況下,mysql會將記錄集的行數返回爲100,這個數字總是等於分頁記錄數。我必須做兩個查詢嗎? (第一個沒有任何'限制'來獲得正確的行數,第二個實際執行偏移量?我需要總數來決定何時顯示下一個/上一級鏈接以及什麼時候不到。 –

+0

ehh很多代碼爲我評論,編輯答案 –

+0

同時,我訪問了http://php.about.com/od/phpwithmysql/ss/php_pagination.htm,在那裏我看到相同的查詢運行兩次回到,正如我評論,一個獲得行數,一個做顯示。我來自ASP背景和ASP,我們有一個概念,移動記錄集遊標。不是再次運行相同的查詢,我不會更好地堅持編譯整個事物並獲得正確數量的行,然後在while循環中,只跳過那些已經顯示的和突破的超出當前窗口? –

0

可以使用offset變量如果這是完整的查詢內容,然後你可以使用:。

select recid from mytable order by recid asc limit 100 offset 300 

例如會給你從300-399很顯然,你將增加100偏移每一頁,所以第一頁偏移量= 0,第二頁偏移= 100等

是一般偏移量=(頁面-1)* 100

正如@Mathieu Lmbert說你可以確保偏移量不會達到9900.

+0

LIMIT 10000 OFFSET 300將不起作用。 – Sven

+0

你是什麼意思,它不會工作?作爲例子,我限制了100偏移量300。注意我有限制100不是10000. – ajon

-2

有效地只能有一個限制,並且它必須在查詢中。所以唯一的解決方案是調整查詢中的LIMIT子句。

你不應該做的事是閱讀所有10.000條目,扔掉你不想要的9900。

+0

獲取10,000條記錄和丟棄9,900是一個可怕的想法。 – TheMethod

+0

如果LIMIT 10000子句不能輕易從查詢中刪除,該怎麼辦? – Sven

1

LIMIT可以有兩個參數,第一個是偏移量,第二個是返回多少條記錄。所以

LIMIT 5,10 

將跳過第5條記錄,然後獲取下一個10

您必須根據當前頁面上設置你的極限。像

LIMIT (CURRENT_PAGE -1) * PAGE_SIZE , PAGE_SIZE 

東西,所以,如果你有十個記錄每頁和爲第2頁上,你會跳過前十個記錄,並抓住未來十年。

1

抵消建議是一個很好的建議,你應該使用它。但是,如果由於某種原因,偏移量不適合您的需求(例如,插入新記錄的人會稍微移動您的頁面),您還可以在查詢中添加where recid> ####子句。使用Twitter API時,您將如何分頁。

以下是PHP中的示例。

<?php 
     $query = 'select recid from mytable'; 
     if(isset($_GET['recid'])&&$_GET['recid']!=''){ 
      $query = $query.' where recid > '.$_GET['recid']; 
     } 
     $query = $query.' order by recid asc limit 10000'; 

     //LOG INTO MYSQL 

     $result = mysql_query($query); 
     $last_id = ''; 

     while ($row = mysql_fetch_assoc($result)) { 
      //DO YOUR DISPLAY WORK 
      $last_id = $row['recid']; 
     } 

     echo '<a href="?recid='.$last_id.'>Next Page</a>'; 
    ?> 

再一次,比需要更復雜一點,但會返回設置頁面。