仅当其他查询的所有值都遵循条件时才更新行

时间:2018-04-14 19:01:50

标签: mysql sql

让我们说我有4张桌子

enter image description here

要求是:

如果供应商接受订单,则在orders_suppliers表中,order_supplier_status_id更改为3.

如果与特定组合订单关联的所有套利者接受了他们的订单,则在Combined_orders表中 Combined_order_status_id更改为3。

如果至少有一个供应商接受了订单并且所有订单都不被接受,则表格中的结果为:Combined_orders Combined_order_status_id更改为2。

我的问题是:只有当所有供应商都接受了订单时,才能在一个查询中将Combined_order_status_id更新为已接受?

类似:

update Combined_orders 
set Combined_orders.Combined_order_status_id = 3 if(all orders_suppliers.order_supplier_status_id == 3 )
 otherwise
 set Combined_orders.Combined_order_status_id = 2
where orders_suppliers.Combined_order_id = Combined_orders.Combined_order_id 

每次供应商接受订单时,我都想执行此查询。

目前我还没有找到一种方法只在一个查询中执行此操作。对我来说,在一个查询中执行此操作非常重要,因为根据我的理解,如果在一个查询中进行,那将是一个原子操作。

1 个答案:

答案 0 :(得分:2)

您可以使用join和汇总:

update Combined_orders co join
       (select os.combined_order_id, min(os.order_supplier_status_id) as min_ossi,
               max(os.order_supplier_status_id) as max_ossi
        from orders_suppliers os
        group by os.combined_order_id
       ) os
       on os.combined_order_id = co.combined_order_id
    set co.Combined_order_status_id = (case when min_ossi = max_ossi and min_ossi = 3 then 3 else 2 end);