前言:
当前看官们对“mysql按周分组”都比较重视,我们都想要了解一些“mysql按周分组”的相关内容。那么小编在网摘上汇集了一些关于“mysql按周分组””的相关知识,希望咱们能喜欢,我们一起来学习一下吧!1、查询某个门店下的商品信息,包含商品主要信息、大中小分类信息
需求背景:
前端选择门店之后,加载门店商品,需要在页面上显示出商品的主要信息以及商品相关的分类信息
结构信息:
1】门店商品表:store_goods(关联字段:store_goods.goods_code -> goods.code)
2】商品主表:goods(关联字段:goods.small_category_id -> goods.code)
3】商品分类表:goods_category(最多三级,分类的上级分类ID存储在parent_id字段内,顶级分类的parent_id=0)
语法说明:
1】将store_goods通过直接的goods_code字段与goods中的code设置字段关联,并将查询结果集放在goods_master中
2】筛选出store_code="S6"的结果集
3】将$goods_master进行拆分,"preserveNullAndEmptyArrays": true,相当于left join
4】对3的结果集挑选出需要的字段,主要是为了需要用到的商品主表字段
5】将4的结果集与goods_category进行关联,由于主表中只有小分类ID,所以将goods_master.small_category_id与goods_category.id进行关联,并将查询结果集放在small_category中
6】对5的结果集,针对small_category进行拆分,再次通过small_category.parent_id与goods_category.id进行关联,这样就可以找到当前小分类所属的中分类信息,将查询结果集放在mid_category中
7】对6的结果集,针对mid_category进行拆分,再次通过mid_category.parent_id与goods_category.id进行关联,这样就可以找到当前中分类所属的大分类信息,将查询结果集放在big_category中
8】最后,对7的结果集针对big_category进行拆分
门店商品结构:
商品结构:
商品分类结构:
db.store_goods.aggregate([ { "$lookup": { "from": "goods", "localField": "goods_code", "foreignField": "code", "as": "goods_master" }},{ "$match": { "store_code": "S6" }},{ "$unwind": { "path": "$goods_master", "preserveNullAndEmptyArrays": true }},{ "$project": { "_id": 0, "store_code": 1, "store_name": 1, "goods_code": 1, "goods_master.last_inprice": 1, "goods_master.name": 1, "goods_master.sales_price": 1, "goods_master.goods_spec": 1, "goods_master.goods_vendor": 1, "goods_master.small_category_id": 1 }},{ "$lookup": { "from": "goods_category", "localField": "goods_master.small_category_id", "foreignField": "id", "as": "small_category" }},{ "$unwind": { "path": "$small_category", "preserveNullAndEmptyArrays": true }},{ "$lookup": { "from": "goods_category", "localField": "small_category.parent_id", "foreignField": "id", "as": "mid_category" }},{ "$unwind": { "path": "$mid_category", "preserveNullAndEmptyArrays": true }},{ "$lookup": { "from": "goods_category", "localField": "mid_category.parent_id", "foreignField": "id", "as": "big_category" }},{ "$unwind": { "path" : "$big_category", "preserveNullAndEmptyArrays": true }}])2、查询订单的入库明细
需求背景:
查看每个订单的入库情况(只查询存在入库记录的订单数据,相当于两张表进行inner join),一个订单可能按照批次多次入库,每次入库产生一个入库单
结构信息:
1】商品主表:bill
2】入库单主表:in_store (关联字段:in_store .bill_no -> bill.bill_no)
语法说明:
1】将bill通过直接的bill_no字段与in_store中的bill_no设置字段关联,并将查询结果集放在in_store中
2】针对$in_store进行拆分
3】按照bill_no维度进行分组,获取查询出来的总数、入库总数(每条入库单的total_goods_amount做sum)、最大的入库数和最小的入库数
4】挑出需要返回的字段
db.bill.aggregate([{ $lookup: { "from": "in_store", "localField": "bill_no", "foreignField": "bill_no", "as": "in_store" }},{ "$unwind": { "path": "$in_store", "preserveNullAndEmptyArrays": false }},{ $group: { _id: '$bill_no', bill_no: {$first: '$bill_no'}, count: {$sum: 1}, sumInAmount: { "$sum": "$in_store.total_goods_amount" }, maxNum: {$max: '$in_store.total_goods_amount'}, minNum: {$min: '$in_store.total_goods_amount'} }},{ $project: { 'bill_no': 1, 'count':1, 'sumInAmount': 1, 'maxNum': 1, 'minNum': 1 }}])
3、查询商品库存信息(一)
需求背景:
商品库存存在多仓,且每个仓库录入库存时都会有不同的批次号。按照《商品编码, 仓库编码》进行分组,查看每个商品在每个仓库内的库存数、最大一次录入库存数、最小一次录入库存数、最早的批次号、最新的批次号
结构信息:
1】商品库存表:goods_store(关联字段:goods_store.goods_code -> goods.goods_code)
2】商品主表:goods
语法说明:
1】将goods_store通过直接的goods_code字段与goods中的goods_code设置字段关联,并将查询结果集放在goods_info中
2】将$goods_info拆分,"preserveNullAndEmptyArrays": false,作用相当于inner join,若后goods没有信息,当前行信息不显示
3】将2获取的结果集按照(goods_code,w_no)进行分组,获取每个门店不同商品的最大数量、最小数量、最大批次号、最小批次号,通江将goods_code和w_no用“-”拼接在一起,起个别名showName
4】对3的结果集挑选出需要的字段
db.goods_store.aggregate([{ $lookup: { "from": "goods", "localField": "goods_code", "foreignField": "goods_code", "as": "goods_info" }},{ "$unwind": { "path": "$goods_info", "preserveNullAndEmptyArrays": false }},{ $group: { _id: { 'goods_code': '$goods_code', 'w_no': '$w_no', }, showName: { $first : {$concat: [ "$goods_code", " - ", "$w_no" ]} }, costPrice: {$first: '$goods_info.cost_price'}, totalNum: {$sum: '$num'}, max_num: {$max: '$num'}, min_num: {$min: '$num'}, max_batch_no: {$max: '$batch_no'}, min_batch_no: {$min: '$batch_no'} }},{ $project: { '_id': 0, 'goodsCode': '$_id.goods_code', 'wno': '$_id.w_no', 'showName': 1, 'costPrice': 1, 'totalNum': 1, 'max_num': 1, 'min_num': 1, 'max_batch_no': 1, 'min_batch_no': 1 }}])
4、查询商品库存信息(二)
需求背景:
商品库存的计算不依赖于库存表(不存在库存表),依赖于入库单的商品明细与出库单的商品明细。也就是说,用入库单的商品明细内的每个商品的入库数量总数 扣减 对应出库单商品的出库总数。
结构信息:
1】商品库存表:goods_store(关联字段:goods_store.goods_code -> goods.goods_code)
2】商品主表:goods
语法说明:
1】先将in_store中的的in_goods拆分
2】将拆分后结果按照 $in_goods.goods_code 进行分组,获取每个商品的入库总数和总金额
3】将2的结果集与out_bill进行联表,关联字段为out_goods.goods_code,由于out_goods是数组,这样的匹配方式不是精确匹配,因为只要out_bill中的out_goods某条数据的goods_code等于关联数据,就会被查询出来,这样会导致不是精准匹配,于是我们将结果集out_list再次进行拆分
4】由于3是将out_bill结果集进行了拆分,我们需要知道里面的商品行数据,于是再次将$out_list.out_goods拆分
5】此时的结果集都是商品维度的了,但是却包含了一些两边goods_code不匹配的数据,我们借助$eq做个辅助字段isEqual,判断条件就是'$goods_code' 和 '$out_list.out_goods.goods_code'
6】经过5处理之后,我们查询isEqual为true的结果,这样就能够保证入库单那边的goods_code与现在出库单的goods_code一一对应了
7】经过6处理之后,结果集仍然不是我们想要的,可以看到100016079918有两条数据,但是他们的出库单号是不一样的,具体的原因在3中已经说明缘由。所以我们需要再次针对goods_code进行分组
8】分组的维度主要针对出库单这边,将商品的出库数量进行汇总
9】经过8处理后的结果集基本上就是我们想要的了,但是是没有经过计算的,如果需要通过查询直接返回剩余库存数,那么就再针对8结果集利用$subtract对"$totalAmount" 和 "$totalOutAmount" 做减法操作就行了,最终获取到每个商品的库存数leftAmount
db.in_store.aggregate([{ "$unwind": "$in_goods"},{ '$group': { '_id': '$in_goods.goods_code', 'goods_code': {'$first': '$in_goods.goods_code'}, 'totalAmount': {'$sum': '$in_goods.in_num'}, 'totalMoney': { "$sum": { "$multiply": ["$in_goods.in_num", "$in_goods.in_price"] } } }},{ "$lookup": { "from": "out_bill", "localField": "goods_code", "foreignField": "out_goods.goods_code", "as": "out_list" }},{ "$unwind": { "path": "$out_list", "preserveNullAndEmptyArrays": false }},{ "$unwind": { "path": "$out_list.out_goods", "preserveNullAndEmptyArrays": false }},{ '$project': { 'goods_code': 1, 'totalAmount': 1, 'totalMoney': 1, 'out_no': '$out_list.out_no', 'out_code': '$out_list.out_goods.goods_code', 'out_amount': '$out_list.out_goods.amount', 'out_price': '$out_list.out_goods.price', 'isEqual': { '$eq': ['$goods_code', '$out_list.out_goods.goods_code'] } }},{ '$match': { 'isEqual': true }},{ '$group': { '_id': '$goods_code', 'goods_code': {'$first': '$goods_code'}, 'totalAmount': {'$first': '$totalAmount'}, 'totalMoney': {'$first': '$totalMoney'}, 'totalOutAmount': {'$sum': '$out_amount'}, 'totalOutMoney': { "$sum": { "$multiply": ["$out_amount", "$out_price"] } } }},{ '$project': { 'goods_code': 1, 'leftAmount': {"$subtract": ["$totalAmount", "$totalOutAmount"]}, 'leftMoney': {"$subtract": ["$totalMoney", "$totalOutMoney"]} }},])
5、查询联系人下单情况
需求背景:
依据订单数据,首先按照会员分组查询出来会员和联系人信息,然后按照联系人分组查询订单情况
结构信息:
1】订单主表:bill
语法说明:
1】首先按照bill中的$backen_user_id字段分组,获取联系人和订单总金额
2】针对1的结果集挑出需要的字段
3】再次按照$link_mobile维度进行分组,获取订单总金额
4】挑出需要返回的字段
----- 对标的mysql查询语句 -----SELECT link_mobile, SUM(totalMoney) AS lastTotalMoneyFROM ( SELECT backen_user_id, link_mobile, SUM(total_money) AS totalMoney FROM bill GROUP BY backen_user_id) AS inner_dataGROUP BY link_mobile
db.bill.aggregate([{ $group: { _id: { 'backen_user_id': '$backen_user_id', }, link_mobile: {$first: '$link_mobile'}, totalMoney: {$sum: '$total_money'} }},{ $project: { 'userId': '$_id.backen_user_id', 'link_mobile': 1, 'totalMoney': 1 }},{ $group: { _id: { 'linkUser': '$link_mobile', }, link_mobile: {$first: '$link_mobile'}, lastTotalMoney: {$sum: '$totalMoney'} }},{ $project: { 'link_mobile': 1, 'lastTotalMoney': 1 }}])
标签: #mysql按周分组 #mysql表最大数量 #mysql获取总数