为什么上一条记录,下一条记录不对呢

彭哥 发布于 2012/04/23 11:35
阅读 384
收藏 0
PHP
<?

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 "没有了";
}

?>
郁闷中为什么不行呢?
加载中
0
iSea
iSea

这样试试

$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";//下一篇文章

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

引用来自“彭哥”的答案

这样下来,我的代码至少要调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 

iSea
iSea
如果前一个没有了,或者后一个没有,会返回NULL
0
酒逍遥
酒逍遥
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数据库支持这种写法吗? 支持的话是一种好方法
0
iSea
iSea

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

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)


iSea
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;
iSea
iSea
回复 @彭哥 : 这里不考虑性能和插几次,只是说语法
彭哥
彭哥
性能上可能要更加多!
彭哥
彭哥
大哥真牛人,这样查不就是分三次查询了吗?
返回顶部
顶部