概述
业务:
管理后台,产品列表(20条分页),需要展示产品销量,没有为0
表
商品表、订单表(订单表有数量)
思路:
- 查询商品列表 --> 遍历商品 --> 用商品ID查询销量(2条SQL,第一条SQL查商品,第二条SQL查数量;但其实是20条;)
- 商品表 LEFT JOIN 订单表(1条SQL统计)
- 第一步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>
最后
以上就是安详烧鹅为你收集整理的【优化】批量查询数量的全部内容,希望文章能够帮你解决【优化】批量查询数量所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复