[不懂就问]遇到一个奇怪得列表排序需求,AABB格式,各位大佬帮忙看下

遇到一个奇怪得排序需求

  • 商家商品列表(分页)商家A、商家B
  • 10条一页
  • 格式为AABB,既
    A商品
    A商品
    B商品
    B商品
    A商品
    A商品
    B商品
    B商品
    A商品
    A商品

请问这种类型得列表怎么查不浪费性能(小弟现在只想到分组拼接),

  • P.S.
    • 需要分页
    • 同理后续多商家如何进行排序(AABBCC)
it_cwc
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 42

新增个排序字段,按排序要求写入排序值

1年前 评论
it_cwc (楼主) 1年前
it_cwc (楼主) 1年前

ORDER BY shop_id ?

指定顺序 ORDER BY FIELD(shop_id,3,2,1,4)

1年前 评论
it_cwc (楼主) 1年前

分开查再组装呗,感觉不难呀,手动计算分页

1年前 评论
it_cwc (楼主) 1年前

假设每页10个数据,商家A总商品10个,商家B总商品5个,商家C总商品2个、记为A10、B5、C2

第一页:10/3=3,先每个商家查3个,实际A3、B3、C2,剩2再A1、B1,总计是A4、B4、C2

第二页:10/3=3,先每个商家查3个,实际A3、B1、C0,剩6再A3,总计是A6、B1、C0

我觉得这样算应该挺快了,资源消耗也没多大

1年前 评论
it_cwc (楼主) 1年前
it_cwc (楼主) 1年前
it_cwc (楼主) 1年前
it_cwc (楼主) 1年前
renxiaotu (作者) 1年前
renxiaotu (作者) 1年前
it_cwc (楼主) 1年前
renxiaotu (作者) 1年前

我想问下,你这个排序,如果有C,D呢,需要怎么排,AABBCCDD吗

1年前 评论
it_cwc (楼主) 1年前
tu6ge-php (作者) 1年前
it_cwc (楼主) 1年前
tu6ge-php (作者) 1年前
tu6ge-php (作者) 1年前
it_cwc (楼主) 1年前
tu6ge-php (作者) 1年前

关于数据重组:


        //每次连续数
        $continuity=2;

        //原始数据
        $shops=[
            ['id'=>1,'name'=>'商家A','goods'=>['a1','a2','a3','a4']],
            ['id'=>2,'name'=>'商家B','goods'=>['b1','b2','b3','b4']],
            ['id'=>3,'name'=>'商家C','goods'=>['c1','c2']],
        ];
        $list=[];
        do{
            foreach ($shops as &$shop){
                for ($i=0;$i<$continuity;$i++){
                    if($good=array_shift($shop['goods'])){
                        $list[]=$good;
                    }else{
                        break;
                    }
                }
            }
        }while(count(array_merge(...array_column($shops,'goods'))));
        echo json_encode($list,JSON_PRETTY_PRINT|JSON_UNESCAPED_UNICODE);

        /*
         * [
            "a1",
            "a2",
            "b1",
            "b2",
            "c1",
            "c2",
            "a3",
            "a4",
            "b3",
            "b4"
           ]
         */
1年前 评论
select field from shop where shop =  A limit 5;
select field from shop where shop =  B limit 5;

然后在PHP层面做拼接。

1年前 评论
skarner

有一个间接处理的方法

在 shop 添加一个 sort 字段,跑脚本去计算 sort 的值

否则查询所有,再来组装太耗性能了

1年前 评论

结束了xdm,打了一顿产品,他屈服了 :sweat_smile:

1年前 评论
MArtian 1年前
kolin 1年前

a b 各查询 N 条记录


foreach ($a as $key => $aa) {
    echo $aa;
    if ($kk % 2 == 0) {
     // foreach ($b)  echo $bb;
    }
}

// echo 可用单独弄个函数,毕竟结构和输出内容相同
1年前 评论
it_cwc (楼主) 1年前
kis龍 (作者) 1年前
it_cwc (楼主) 1年前
Complicated

感觉还是加字段帮助吧,数据量上来,算的话比较麻烦,而且,每一页数据多了也比较耗时间。用 observer,,监听这个表的数据库事件就好了,很简单。

1年前 评论
aab

可以描述一下使用的 MySQL 的版本,感觉这个功能窗口函数可以解决。不过感觉这个需求本身就不合理

1年前 评论

换一个角度,从商家表去查,然后关联产品表呢?

$page = request()->page?:0;
$shops_count = Shop::count();
$take = ceil(10/$shops_count);
$products = Shop::with(['products' => function ($query) use ($take, $page) {
    $query->take($take)->skip($take * $page);
}])->get();
1年前 评论
zhengmin4516 (作者) 1年前

典型的row_number场景

select a,b,c,d,row_number over ( partition by xx order by xx desc) as rn where rn <= 2

1年前 评论
阿尔卡蒂奥 1年前

sql 查询实现起来可能需要多条语句跑出来组合才行
试试数据入 elasticsearch 吧

1年前 评论
//     P1,P2,P3,P4,P5,P6
//S1   01,02,13,14,25,26,
//S2   03,04,15,16,27,28,
//S3   05,06,17,18,29,30,
//S4   07,08,19,20,31,32
//S5   09,10,21,22,33,34,
//S6   11,12,23,24,35,36,

$sm = 6; # 店铺总数
$pn = 5; # 店铺商品排序值
$sn = 5; # 店铺排序值
$sort = floor($pn / 2) * $sm * 2 + ($pn % 2 +  ($sn - 1) * 2);
1年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!