循环MySQL结果

时间:2011-07-20 14:27:05

标签: php mysql while-loop

我不确定这是怎么调用的,但我会尽力描述我想要实现的目标。

因此,首先,有一个名为$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

因此,在请求标识为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页,分别没有$id9时的输出。

所以我的问题是:当没有足够的结果(少于3个)显示时,有没有办法从头开始?

  • 访问/page.php?id=8时,输出应包含ID为912的网页。
  • 访问/page.php?id=9时,输出应包含ID为123的网页。
  • 访问/page.php?id=3时,输出应包含ID为456等的网页。

3 个答案:

答案 0 :(得分: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。

答案 1 :(得分: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

答案 2 :(得分: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");
 }