2011-07-20 73 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"); 
}