你的位置:
问答吧
-> PHP进阶
-> 问题详情
PHP+MYSQL如何取出一条记录的周围几条记录
现在在开发一套商城系统,碰到一个小问题。
比如我展示一个商品,在这个商品下面我想列出这个商品周围几条记录。
类似于这种排列方式,如下图:
当商品10前面没有记录时,则显示10后面的几条记录。
当商品10后面没有记录时,则显示10前面的几条记录。
当商品10前后都有记录时,则同时显示周围的几条记录。
虽然可以通过分别计算商品10的前后几条记录再取出相应的记录来达到目的,但是过程复杂,效率太差。
我在网上看到一些相册,好象有类似于这种,不知道大家有没有这方面的经验?
或者有没有好的想法?
引用:有人给出这个方法:
需要两条SQL语句
假如商品10的ID是10,则前两条:
SELECT * FROM product WHERE id < 10 ORDER BY id DESC LIMIT 2;
后两条:
SELECT * FROM product WHERE id > 10 ORDER BY id ASC LIMIT 2;这个方法一开始的时候已经考虑过了,为什么我没采用呢?
当商品10前面没有商品的时候(比如我删除了1-9的商品),那么我想排列应该是10 11 12 13 14 15。反之,10后面没商品的时候,应该是6 7 8 9 10。那么这种方式显然不大合适。如果10之前只有8,那么排列应该是8 10 11 12 13 14。
如果采用这种方法又想达到我的那种排列方式,那么肯定要计算商品10之前有几条记录,然后根据这个数字来决定商品10之后应该取出几条记录,但这么一弄的话,程序就变的复杂,速度应该也有不小的影响。
本来还想到的方法就是:采用文件缓存数据。就是把商品10的这些相关数据记录到缓存文件中,当访问到这个ID的商品时就把这个文件include进来。这个问题虽然解决了速度和效率问题,但出现另一个问题:删除商品的时候。这些缓存文件无法及时得到更新。
所以MySql中有没有这么一种函数或者方法,能够把商品10周围的记录同时读取出来?或者有更简介有效的达到我想要的这种效果
---------------------------------------------------------------------------------------------------------------------
感谢大家,我还是采用了最初的一个想法,比较笨一点。
先是计算ID=10之前有几条记录(限制只取3条),变量为$prenum,再计算后有几条记录,变量为$nextnum。总体要显示的数据为$allnum。两边记录数相等的情况为$pernum=$allnum/2。
然后根据这两个数据实际的大小来计算应该取出的记录数。
复制内容到剪贴板
代码:if ($prenum >$nextnum&&$nextnum
$pre=$pernum;//前面应该取出的记录数
$next=$allnum-$prenum;、、后面应该取出的记录数
}elseif ($nextnum >$prenum&&$prenum
$pre=$allnum-$nextnum;
$next=$nextnum;
}else{
$pre=$prenum;
$next=$nextnum;
}
//取出前几条
select id from table where id < '$id' limit $pre
//取出后几条
select id from table where id > '$id' limit $next过程有点繁杂,速度一般
具体应用情况:http://60x100.com/Mall/C-003/000011.html
[ 本帖最后由 啊哈 于 2007-5-10 11:07 编辑 ]
作者: 啊哈
发布时间: 2007-05-09
没人知道吗
作者: 啊哈
发布时间: 2007-05-09
本人也菜,给楼主个小思路吧
select * from table where id between 10 and 20 limit 5;
这个就是读ID在10到20间的前5条数据
根据你的程序变通下
select * from table where id between id值-5 and id值+5 limit 5;
这句保证能用的,不管你的数据有多少条 ID值在什么位置
MYSQL会处理好这一些逻辑的。
作者: gozone
发布时间: 2007-05-09
引用:原帖由 gozone 于 2007-5-9 14:34 发表
本人也菜,给楼主个小思路吧
select * from table where id between 10 and 20 limit 5;
这个就是读ID在10到20间的前5条数据
根据你的程序变通下
select * from table where id between id值-5 and i ...长见识了.
作者: coolsail
发布时间: 2007-05-09
我试了一下
如果采用这种方法又想达到我的那种排列方式,那么肯定要计算商品10之前有几条记录,然后根据这个数字来决定商品10之后应该取出几条记录,但这么一弄的话,程序就变的复杂,速度应该也有不小的影响。
效率一般吧,如果页面只有一个这样的显示,而又没有其它太多sql操作,可以用一下
select * from table where id between id值-5 and id值+5 limit 5;
这一个的话,好像还是不能100%达到楼主说的那种要求
期待更好的答案
作者: leepoor
发布时间: 2007-05-09
这个只是一个简单的方法
但能否有效果还看要实际情况
假如当前ID是26,读取前或者后5个记录的话,那就得保证21-31之间至少有5个记录,这样才会有满意的结果。
如果你数据只有17,18,19,20,26,27,28。。。这样的话
它就无法得到17,18,19,20这几条信息了
其他的办法还没想到,期待高人解答哈
作者: gozone
发布时间: 2007-05-09
SELECT * FROM product WHERE id = 10
UNION ( SELECT * FROM product WHERE id < 10 ORDER BY id DESC LIMIT 4 )
UNION ( SELECT * FROM product WHERE id > 10 ORDER BY id ASC LIMIT 4 )
ORDER BY id ASC
这个 4 是根据你的假设来的!
例如可能的结果:
6 7 8 9 10 11 12 13 14
7 8 9 10 11 12 13 14
8 9 10 11 12 13 14
9 10 11 12 13 14
10 11 12 13 14
6 7 8 9 10
6 7 8 9 10 11
6 7 8 9 10 11 12
6 7 8 9 10 11 12 13
当然结果也可能是条约的ID,
得到结果后用程序判断一下 10 在结果数组中的位置,然后用数组 array_slice 函数 出从 10 的位置往后 4个长度 就可以了
[ 本帖最后由 terry39 于 2007-5-9 17:42 编辑 ]
作者: terry39
发布时间: 2007-05-09
感谢大家,我还是采用了最初的一个想法,比较笨一点。
先是计算ID=10之前有几条记录(限制只取3条),变量为$prenum,再计算后有几条记录,变量为$nextnum。总体要显示的数据为$allnum。两边记录数相等的情况为$pernum=$allnum/2。
然后根据这两个数据实际的大小来计算应该取出的记录数。
复制内容到剪贴板
代码:if ($prenum >$nextnum&&$nextnum
$pre=$pernum;//前面应该取出的记录数
$next=$allnum-$prenum;、、后面应该取出的记录数
}elseif ($nextnum >$prenum&&$prenum
$pre=$allnum-$nextnum;
$next=$nextnum;
}else{
$pre=$prenum;
$next=$nextnum;
}
//取出前几条
select id from table where id < '$id' limit $pre
//取出后几条
select id from table where id > '$id' limit $next过程有点繁杂,速度一般
具体应用情况:http://60x100.com/Mall/C-003/000011.html
[ 本帖最后由 啊哈 于 2007-5-10 11:06 编辑 ]
作者: 啊哈
发布时间: 2007-05-10