mysql 两条记录的位置_PHP+MYSQL如何取出一条记录的周围几条记录

你的位置:

问答吧

-> 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 ...长见识了.

c96cf49fd0abae9ef11d4de91e89712e.png

作者: 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值