2011-07-20 112 views
1

我不確定如何調用這個函數,但我會盡可能描述我想達到的效果。通過MySQL循環播放結果

所以,首先,有一個變量,稱爲$id,其實際上是$_GET['id']。假設用戶通過請求輸入以下頁面:/page.php?id=6。現在我需要做的是提供關於數據庫後面3頁的信息。這裏是數據庫:

TABLE `pages` 

    id | page_name 
    ______________________ 
    1 | AAAAA 
    2 | BBBBB 
    3 | CCCCC 
    4 | DDDDD 
    5 | EEEEE 
    6 | FFFFF 
    7 | GGGGG 
    8 | HHHHH 
    9 | IIIII 

所以,當請求頁面id爲6,下面的腳本返回下一個3頁(7,8,9):

$res = mysql_query("SELECT * FROM `pages` WHERE `id`>'".intval($id)."' ORDER BY `id` DESC LIMIT 3"); 
while($arr = mysql_fetch_assoc($res)) 
{ 
     print("Page ID: ".$arr['id']."; Page Name: ".$arr['page_name']."\n"); 
} 

這裏是輸出:

Page ID: 7; Page Name: GGGGG 
Page ID: 8; Page Name: HHHHH 
Page ID: 9; Page Name: IIIII 

,它工作正常,直到$id是大於6,當它是(/page.php?id={7/8/9}),輸出不顯示3頁了,而是2頁,1個PAG e,當$id9時,分別沒有輸出。

所以我的問題是:有沒有一種方法可以返回並從沒有足夠的結果(小於3)開始顯示?

  • 當訪問/page.php?id=8,輸出應包含ID 912頁面。
  • 訪問/page.php?id=9時,輸出應包含頁面,其編號爲1,2,3
  • 訪問/page.php?id=3時,輸出應該包含編號爲4,5,6等的頁面。
+2

你的意思是比執行查詢的第二次沒有WHERE條件和其他基於您第一次獲得的結果數量的LIMIT? – Oswald

回答

4
(SELECT *, 0 AS custom_order FROM `pages` WHERE `id`>'".intval($id)."' ORDER BY `id` ASC LIMIT 3) 
UNION ALL 
(SELECT *, 1 AS custom_order FROM `pages` ORDER BY `id` ASC LIMIT 3) 
ORDER BY custom_order, id ASC 
LIMIT 3 

這樣,你總能得到3頁。如果沒有足夠的下一頁,你將從一開始就達到3。

+0

比根據從第一個查詢得到的結果的數量執行第二個查詢更有效嗎? – technology

+0

是的,這是肯定的。 –

+0

謝謝,它工作得很好。在第4行有一個錯字,'custom_orer'應該是orDer。 – technology

0

您可以修改查詢是這樣的:

select * from 
    (select *, id-$inval($id) as order_by 
     from pages were id > $inval($id) order by id asc limit 3 
     union 
     select *, id as order_by 
     from pages order by id asc limit 3) as pages 
order by order_by asc 
0

我會解決這個問題的方式(一個可能的問題是,結果集可能包含最多6條,而不是3):

$res = mysql_query("(SELECT * FROM `pages` WHERE `id`>'".intval($id)."' ORDER BY `id` ASC LIMIT 3) UNION DISTINCT (SELECT * FROM `pages` WHERE id>0 ORDER BY id ASC LIMIT 3)"); 
$counter = 0; 
while($arr = mysql_fetch_assoc($res) && $counter<3) 
{ 
     $counter++; 
     print("Page ID: ".$arr['id']."; Page Name: ".$arr['page_name']."\n"); 
}