排序问题

问题描述

最近遇到一个问题,需要对一张表中的记录进行前后排序。这看似是很简单的问题,使用order就可以实现,

比如:在数据库中设置一个专门字段用来表示输出顺序,再来结合order就可以实现按序输出了。

但是这里仅仅是指输出!!!当设置完新的输出顺序之后,难道你还将数据库中的该字段全部更新一遍?如果你的答案是Yes,那么我只能回答你“呵呵”。

解决方案

其实这里有一个突破口!那就是数据库怎么存都没问题,重点是每次都能按照我的期望将数据进行输出,所以我们只要保存希望输出的顺序就行了,这里拿下面的表做例子:

字段名说明
goods_id主键
goods_name商品名称

其他字段都不用了,这里我们希望能按下面的顺序输出数据:

goods_idgoods_name
1g1
10g2
3g3
6g4
8g5
11g7

看出来了吗?我们只要保存的信息就是

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,

这样我们在下次调用时都很麻烦,所以我能想出的结果办法就是上面那样。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Elasticsearch中,排序问题可能出现在聚合操作中。根据引用的描述,Elasticsearch在排序操作时,会先对每个分片进行排序,然后将每个分片的前17名结果进行再次聚合和排序,最终返回排序后的前5条记录作为结果。这个排序策略来源于官方给出的算式,根据算式,如果请求只发往一个分片,就返回前5条记录;如果请求发送给多个分片,每个分片返回的记录数是5 * 1.5 = 17。这个策略可能导致在返回的数据中,实际的排序结果与期望的排序结果不一致。 因此,如果你在Elasticsearch中遇到排序问题,可以检查是否涉及到了多个分片,并且了解Elasticsearch的排序策略。你可以参考引用提供的链接来了解更多关于Elasticsearch排序操作的详细信息。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Elasticsearch聚合学习之五:排序结果不准的问题分析](https://blog.csdn.net/boling_cavalry/article/details/90319399)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [3. elasticsearch 汇总排序问题剖析](https://blog.csdn.net/wangzhiqiang123456/article/details/123073114)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值