Mysql 使用事件计划程序更新多行
我有这样的条件,我有付款的历史记录,如果状态在1天内仍在等待付款,库存将根据购买的产品数量恢复到第一个值。 我有这样的疑问Mysql 使用事件计划程序更新多行,mysql,sql,sql-update,Mysql,Sql,Sql Update,我有这样的条件,我有付款的历史记录,如果状态在1天内仍在等待付款,库存将根据购买的产品数量恢复到第一个值。 我有这样的疑问 > CREATE EVENT `stok_sch` ON SCHEDULE > EVERY 1 SECOND > DO BEGIN > UPDATE product a > SET a.stock = a.stock + > (select ifnull((select sum(amount) fr
> CREATE EVENT `stok_sch` ON SCHEDULE
> EVERY 1 SECOND
> DO BEGIN
> UPDATE product a
> SET a.stock = a.stock +
> (select ifnull((select sum(amount) from order_detail x left join order y using (idOrder)
> where y.status='Waiting for payment' and x.idProduct=a.idProduct
> and (date_format(y.order_date,'%Y%m%d')+1 = date_format(now(),'%Y%m%d')+0 or date_format
> (y.order_date,'%Y%m%d')+1 < date_format(now(),'%Y%m%d')+0) group by x.idProduct),0));
>
> UPDATE order set status ='Cancel' where status ='Waiting for payment' and (date_format(order_date,'%Y%m%d')+1 < date_format
>
> (now(),'%Y%m%d')+0 OR date_format(order_date,'%Y%m%d')+1 = date_format(now(),'%Y%m%d')+0);
> END$$;
我已经更新了我的查询,如果我在没有事件计划的情况下运行它,它可以正常工作,但是当我将它与事件计划程序结合使用时,产品的库存将比购买的数量增加一倍。
有办法解决这个问题吗 您可以尝试两件事: 1用JOIN替换LEFT JOIN,这样您只能获得实际订单 2不要在SET stock=stock+中的子查询中引用ab.amount。。。部分改为参考x.amount: 现在查询将如下所示:
UPDATE product AS a, product_detail AS ab, order AS b
SET stock=a.stock +
(select sum(x.amount) as amount
from product_detail x
join order y using (idOrder)
where y.status='waiting for payment'
and x.idProduct = a.idProduct
group by x.idProduct
)
WHERE a.idProduct=ab.idProduct
AND ab.idOrder=b.idOrder
AND b.status='waiting for payment'
and (date_format(order_date,'%Y%m%d')+1 = date_format(now(),'%Y%m%d')+0 or date_format(order_date,'%Y%m%d')+1 < date_format(now(),'%Y%m%d')+0)
;
使用日期比较,而不是转换为数字,还要意识到,如果有人在晚上10点下订单,该订单将在午夜后立即取消
UPDATE product p
JOIN (SELECT
d.idProduct,
SUM(d.amount) amount
FROM
`order` o
JOIN product_detail d
ON o.order_id = d.order_id
WHERE
o.status = 'waiting for payment'
AND
DATE(o.order_date) >= CURRENT_DATE - INTERVAL 1 DAY
GROUP BY idProduct
) pd
ON p.idProduct = pd.idProduct
SET
p.stock = p.stock + pd.amount
WHERE
p.idProduct = pd.idProduct
请给出查询的格式:您好,谢谢您的帮助:D这是我的第一次time@yobuD-选择代码,按ctrl+k==为您设置格式。当我在没有事件计划的情况下运行它时,它工作正常,但我遇到了另一个问题,当我将查询与我的事件计划程序相结合时,库存将从购买量更新两次。示例:使用idproduct ss1 stock 4表product,然后我订购的产品ss1多达2个,并且我的状态为“等待付款”。我从电脑上更新了我的日期,我的状态变为取消,这是真的,库存应该是4,就像第一个一样,但问题是更新了一倍,变成了6。。为什么呢@Bennihey谢谢你的回答,但还是一样,我的股票仍然有问题..当我将查询与我的事件shceduler结合时,它更新了两次?有什么想法吗@GervsOops,我的错误,在子查询中忘记了group by。更改了我的回答为什么我用此查询开始活动?库存更新两次/两倍于购买量?