我不确定这是怎么调用的,但我会尽力描述我想要实现的目标。
因此,首先,有一个名为$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页,分别没有$id
为9
时的输出。
所以我的问题是:当没有足够的结果(少于3个)显示时,有没有办法从头开始?
/page.php?id=8
时,输出应包含ID为9
,1
和2
的网页。 /page.php?id=9
时,输出应包含ID为1
,2
,3
的网页。 /page.php?id=3
时,输出应包含ID为4
,5
,6
等的网页。答案 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");
}