我是靠谱客的博主 安详烧鹅,最近开发中收集的这篇文章主要介绍【优化】批量查询数量,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

业务:

管理后台,产品列表(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>

最后

以上就是安详烧鹅为你收集整理的【优化】批量查询数量的全部内容,希望文章能够帮你解决【优化】批量查询数量所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(36)

评论列表共有 0 条评论

立即
投稿
返回
顶部