问题描述
最近遇到一个问题,需要对一张表中的记录进行前后排序。这看似是很简单的问题,使用order就可以实现,
比如:在数据库中设置一个专门字段用来表示输出顺序,再来结合order就可以实现按序输出了。
但是这里仅仅是指输出!!!当设置完新的输出顺序之后,难道你还将数据库中的该字段全部更新一遍?如果你的答案是Yes,那么我只能回答你“呵呵”。
解决方案
其实这里有一个突破口!那就是数据库怎么存都没问题,重点是每次都能按照我的期望将数据进行输出,所以我们只要保存希望输出的顺序就行了,这里拿下面的表做例子:
字段名 | 说明 |
---|---|
goods_id | 主键 |
goods_name | 商品名称 |
其他字段都不用了,这里我们希望能按下面的顺序输出数据:
goods_id | goods_name |
---|---|
1 | g1 |
10 | g2 |
3 | g3 |
6 | g4 |
8 | g5 |
11 | g7 |
看出来了吗?我们只要保存的信息就是
1,10,3,6,8,11
当我们想输出数据时,只要将数据按照上面的顺序进行输出,当需要进行分页时,就使用
$order_string="1,10,3,6,8,11";
$order_array=explode(",",$order_string);
//当需要进行分页时,假设页面数为:$p,每页显示商品数量为$every_page_data
$offset=($p-1)*$every_page_data;
$show_goods_id_array=array_slice($order_array,$offset,$every_page_data);
$show_goods_id_string=implode(",",$show_goods_id_array);
上面使用的获取分页信息的方法可能比较麻烦,但是鉴于我还是一只小白,所以请大神指点。
数据存储
上面我们介绍了仅需存储数据输出的顺序,但是这个数据存储在哪里就是一个问题了,这里是刚好项目决定采用Redis数据库,所以就作为一个简单的key-value,存储在字符串类型的value中了。
删除数据
上面仅仅是存储了现有数据,但是问题是当数据进行修改时,比如删除其中的一个goods信息时,这个时候你就需要一起将输出顺序进行输出,就是删除其中的goods_id,删除我采用的方式是这样的:
$delete_goods_id;
$order_string="1,10,3,6,8,11";
$order_array=explode(",",$order_string);
foreach($order_array as $key=>$value){
if($value==$delete_goods_id){
unset($order_array[$key]);
break;
}
}
$new_order_string=implode(",",$order_array);
上面我使用了很麻烦的方式去遍历数组,发现该元素后删除该元素,之后再重新组合成字符串,真的是很麻烦,我原来的思路是这样的:
$new_order_string=str_replace($delete_goods_id,"",$order_string);
但是这样存在一个很大的问题,假设原始的数据信息是这样的:
1,2,待删除内容,4,5,6
执行上面的处理结果后就变成了:
1,2,,4,5,6
就会有一个数据位是空的。当待删除的数据在首位或者末尾时,最后的结果就是这样的:
,1,2,3,4,5
1,2,3,4,
这样我们在下次调用时都很麻烦,所以我能想出的结果办法就是上面那样。