Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 使用事件计划程序更新多行_Mysql_Sql_Sql Update - Fatal编程技术网

Mysql 使用事件计划程序更新多行

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

我有这样的条件,我有付款的历史记录,如果状态在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) 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。更改了我的回答为什么我用此查询开始活动?库存更新两次/两倍于购买量?