5
回答
为什么上一条记录,下一条记录不对呢
极速云服务器,低至1.04元/天>>>   
<?

mysql_connect('localhost','root','123456') or die(mysql_error());
mysql_select_db('jsd');
mysql_query("set names 'utf8'");
$cid=$_REQUEST['id'];//是你当前文章的编号
$sql ="select * from pyl_main where id>$cid and Ppid=58 order by id desc limit 0,1"; //上一篇文章
$sql1 ="select * from pyl_main where id<$cid and Ppid=58 order by id asc limit 0,1";//下一篇文章

$result = mysql_query( $sql );
if( mysql_num_rows( $result ) )
{
$rs = mysql_fetch_array( $result );
echo "上一篇<A href='k.php?id=".$rs['id']."&pid=".$rs['Ppid']."'>".$rs['Pname']."</a>";
}
else
{
echo "没有了";
}

$result1 = mysql_query( $sql1 );
if( mysql_num_rows( $result1 ) )
{
$rs1 = mysql_fetch_array( $result1 );
echo "下一篇<A href='k.php?id=".$rs['id']."&pid=".$rs['Ppid']."'>".$rs['Pname']."</a>";
}
else
{
echo "没有了";
}

?>
郁闷中为什么不行呢?
PHP
举报
彭哥
发帖于6年前 5回/373阅
共有5个答案 最后回答: 6年前

这样试试

$sql ="select * from pyl_main where id<$cid and Ppid=58 order by id desc limit  1"; //上一篇文章
$sql1 ="select * from pyl_main where id>$cid and Ppid=58 order by id asc limit 1";//下一篇文章

--- 共有 9 条评论 ---
彭哥回帖太快了点,悠着点:) 红薯哥也风趣!!! 这样下来,我的代码至少要调5次数据表了,我不太喜欢,能不能更在这段代码上加工下,只要调一次数据表! 6年前 回复
彭哥回复 @leo108 : 额,我一开始就写了rs1,要是有更精简的代码就好了! 6年前 回复
iSea回复 @彭哥 : 是你第二次调用了第一次的结果 6年前 回复
leo108回复 @彭哥 : 还没发现问题么 6年前 回复
彭哥回复 @leo108 : rs1,其实我都嫌这个代码就是要访问2次数据库,要是只访问一次就好了!!!! 6年前 回复
这样下来,我的代码至少要调5次数据表了,我不太喜欢,能不能更在这段代码上加工下,只要调一次数据表!
--- 共有 5 条评论 ---
彭哥回复 @彭哥 : 是啊,是不是$id-1和$id+1 6年前 回复
彭哥回复 @青春陪葬了无知的年华 : 怎么取得下一条和上一条记录号呢? 6年前 回复
iSea回复 @彭哥 : 不要求连号呀。自己实践一下吧 6年前 回复
彭哥原理懂,但控制代码功力不济,请问有没有样例,还有,要是ID不连号也行吗? 6年前 回复
iSea那你就一次查出来哦!按升序(或降序)排列,limit 3,从 id < 当前id( id > 当前id) 的第一条记录开始 6年前 回复

引用来自“彭哥”的答案

这样下来,我的代码至少要调5次数据表了,我不太喜欢,能不能更在这段代码上加工下,只要调一次数据表!

//前一个id

SELECT MAX(id) FROM pyl_main WHERE id < $cid AND Ppid=58 ORDER BY id DESC

//后一个id

SELECT MIN(id) FROM pyl_main WHERE id > $cid AND Ppid=58 ORDER BY id ASC 

--- 共有 1 条评论 ---
iSea如果前一个没有了,或者后一个没有,会返回NULL 6年前 回复
select * from pyl_main where id<$cid and Ppid=58 order by id desc limit  1 union all select * from pyl_main where id>$cid and Ppid=58 order by id asc limit 1

用 union把 两条语句的查询结果联合起来不就 只调用一次了么..
--- 共有 1 条评论 ---
彭哥mysql数据库支持这种写法吗? 支持的话是一种好方法 6年前 回复

引用来自“酒逍遥”的答案

select * from pyl_main where id<$cid and Ppid=58 order by id desc limit  1 union all select * from pyl_main where id>$cid and Ppid=58 order by id asc limit 1

用 union把 两条语句的查询结果联合起来不就 只调用一次了么..
回复 @彭哥 : mysql不支持这样写,mysql中的union all用到limit,order by时要在每个select子句加上括号!
你可以这样写:
(SELECT * FROM pyl_main WHERE id<$cid AND Ppid=58 ORDER BY id DESC LIMIT 1)
UNION ALL
(SELECT * FROM pyl_main WHERE id=$cid AND Ppid=58)
UNION ALL
(SELECT * FROM pyl_main WHERE id>$cid AND Ppid=58 ORDER BY id ASC LIMIT 1)


--- 共有 4 条评论 ---
iSea回复 @彭哥 : 要少查询你可以类似这样写: SELECT * FROM table1 a ,(SELECT * FROM table1 WHERE id<$id ORDER BY id DESC LIMIT 1) b WHERE a.id >= b.id ORDER BY a.id ASC LIMIT 3; 6年前 回复
iSea回复 @彭哥 : 这里不考虑性能和插几次,只是说语法 6年前 回复
彭哥性能上可能要更加多! 6年前 回复
彭哥大哥真牛人,这样查不就是分三次查询了吗? 6年前 回复
顶部