【优化】批量查询数量

4 篇文章 0 订阅

业务:

管理后台,产品列表(20条分页),需要展示产品销量,没有为0

商品表、订单表(订单表有数量)

思路:

  1. 查询商品列表 --> 遍历商品 --> 用商品ID查询销量(2条SQL,第一条SQL查商品,第二条SQL查数量;但其实是20条;)
  2. 商品表 LEFT JOIN 订单表(1条SQL统计)
  3. 第一步sql:查询商品列表–>
    第二步sql:mybatis,查询产品销量(结果作为条件,foreach遍历),返回 id和销量的集合 --> 将List转成map(这个列表中不会出现没有销量或不满足条件的产品) -->
    第三步:遍历第一步结果,同时判断,商品id在第二步中是否存在,存在就将结果赋值;没有值则赋0;

代码:

第二种做法

<!-- 商品列表 -->
<select id="getSpuCoinList" resultType="la.newlife.coin.dto.CoinSpuInfoDTO">
    SELECT
        csi.coin_spu_id,
        csi.coin_spu_name,
        csi.accumulate_points,
        csi.original_price,
        csi.loop_pics,
        csi.propagate_pics,
        csi.introduce_pics,
        csi.introduction,
        csi.coin_spu_state,
        csi.coin_stock,
        IFNULL(SUM(coi.spu_num), 0) AS spuSellNum
    FROM
        coin_spu_info AS csi
            LEFT JOIN coin_order_info AS coi ON csi.coin_spu_id = coi.coin_spu_id
            AND coi.deleted = 0 AND (coi.order_status = 2 or coi.order_status = 3 or coi.order_status = 4 or coi.order_status = 5 or coi.order_status = 7)
    <where>
        csi.deleted = 0
        <if test="coinSpuState == 0 or coinSpuState == 1">
            AND csi.coin_spu_state = #{coinSpuState}
        </if>
        <if test="coinSpuName != null and coinSpuName != ''">
            AND csi.coin_spu_name LIKE CONCAT('%', #{coinSpuName},'%')
        </if>
    </where>
    GROUP BY csi.coin_spu_id
    ORDER BY csi.coin_spu_id DESC
</select>

第三种做法

 @Override
 public AjaxResult testApi() {
     CoinSpuInfoDTO coinSpuInfoDTO = new CoinSpuInfoDTO();
     coinSpuInfoDTO.setPageNum(1);
     coinSpuInfoDTO.setPageSize(20);
     CoinSpuInfoReturnDTO.CoinSpuInfoReturnDTOBuilder builder = CoinSpuInfoReturnDTO.builder();
     com.github.pagehelper.Page<Object> page = null;
     if(null != coinSpuInfoDTO.getPageNum() && null != coinSpuInfoDTO.getPageSize()) {
         page = PageHelper.startPage(coinSpuInfoDTO.getPageNum(), coinSpuInfoDTO.getPageSize());
     }
     //列表
     List<CoinSpuInfoDTO> spuInfoList = coinSpuInfoService.getSpuCoinList(coinSpuInfoDTO);
     List<CoinOrderInfoDTO> coinorderList = null;
     if (CollectionUtil.isNotEmpty(spuInfoList)){
         coinorderList = coinOrderInfoService.getSpuSellNum(spuInfoList);
         Map<Long, Long> map = coinorderList.stream().collect(Collectors.toMap(
                                                             CoinOrderInfoDTO::getCoinSpuId,
                                                             CoinOrderInfoDTO::getSpuSellNum
                                                     ));
         for (CoinSpuInfoDTO coinSpuInfo : spuInfoList) {
             if (map.containsKey(coinSpuInfo.getCoinSpuId())) {
                 Long spuSellNum = map.get(coinSpuInfo.getCoinSpuId());
                 coinSpuInfo.setSpuSellNum(spuSellNum);
             } else {
                 coinSpuInfo.setSpuSellNum(0L);
             }
         }
     }
     builder.rows(spuInfoList);
     if(null != page) {
         builder.total(page.getTotal());
     }
     return AjaxResult.success(builder.build());
 }
<!-- 产品销量 -->
<select id="getSpuSellNum" resultType="la.newlife.coin.dto.CoinOrderInfoDTO">
    SELECT
        coin_spu_id,
        SUM(spu_num) AS spuSellNum
    FROM
         coin_order_info
    WHERE
        coin_spu_id IN
        <foreach collection="spuInfoList" item="item" open="(" close=")" separator=",">
            #{item.coinSpuId}
        </foreach>
        GROUP BY coin_spu_id
</select>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值