求MySQL实现根据提供的时间检测出产品表,上架后时间之内不动销的产品?


有三个表 第一个表是产品表(goods):


 字段:id,goods_id,....

第二个表是订单-商品表(order):


 字段:id,goods_id,order_id,....

第三个表是订单详情表(order_info):


 字段:id,order_id,pay_time,...

产品表 和 订单-商品表 是一对多的关系
订单-商品表 和 订单详情表 是一对一的关系
订单-商品表没有订单完成的状态,但是可以根据 订单详情表 的pay_time(支付时间)判断是否完成订单

现在要实现的是根据提供的时间检测出产品表,上架后时间之内不动销的产品?

补充:现在已经完成goods表关联order表查询获得没有订单的产品ID了,但是需要关联第三个表,还需要加上时间筛选,感觉之前的办法很难实现。

yii mysql php

甜虾没有脑 11 years, 1 month ago

分析一下问题,个人窃以为难以实现的关键:

  1. 不动销的概念不清晰 。不知道是题主描述的不够清晰,还是题主本来对需求理解的不够清晰。不动销是指某个商品根本就没有订单,还是指支付成功笔数在多少数量之内呢?
  2. 订单表设计的不合理 。从题主的描述来看,这是一个很明显的交易系统,涉及商品、订单、支付3个环节,后续还可能还涉及到题主未提及的发货、结算、退款和对账等环节。 订单作为交易系统的核心环节,题主给出的表结构很显然没法体现一个交易流程当前处在哪个环节,即缺少订单的状态 。这就造成很难判断订单的统计标准。
  3. 由于第2点的问题导致关联的商品分析也比较困难。题主给出的根据支付时间判断订单完成与否,是存在一定问题:首先,交易系统的时间一般只是作为日志信息记录, 一个订单是否完成或处在哪个阶段是不能也不应该由时间确定,而应该有一个确定明确的标志 ;其次,系统的时间往往受很多因素影响,它不是一个精确值,对于分布式系统,其精确度更差,这样在一定程度上对以时间为统计依据的结果必然会带来影响。

综上几点,个人觉得题主应该在订单表(order),增加状态列(status)信息,这样的话就很好统计了。例如status=1表示订单完成,则SQL如下:


 1. 交易订单少于指定笔数为不动销
select goods_id from (
select goods_id, count(1) as num
from order
where status = 1
group by goods_id) t
where t.num < 10; 

2. 无交易订单为不动销
select goods_id
from goods g
where g.goods_id not in (
select distinct goods_id
from order t
where t.status = 1)

乱入的喜剧 answered 11 years, 1 month ago

Your Answer