架构:
create table `order` -- not a great name by the way
( Order_Id int auto_increment primary key,
Total_Price decimal (10,2) not null
);
create table food_order
( id int auto_increment primary key,
Order_Id int not null,
Total_Price decimal(10,2) not null, -- line item total price
key(Order_Id), -- make it fast
-- FK below
CONSTRAINT fk_fo_toOrder FOREIGN KEY (Order_Id) REFERENCES `order`(Order_Id)
);
create table drink_order
( id int auto_increment primary key,
Order_Id int not null,
Total_Price decimal(10,2) not null, -- line item total price
key(Order_Id), -- make it fast
-- FK below
CONSTRAINT fk_do_toOrder FOREIGN KEY (Order_Id) REFERENCES `order`(Order_Id)
);
insert `order`(total_price) values (0),(0),(0); -- 3 orders
insert food_order(Order_Id,Total_Price) values (1,1.11),(1,2.22),(1,4.44),(2,20),(2,11.11);
insert drink_order(Order_Id,Total_Price) values (2,22.22),(2,33.33),(3,1000),(3,2000);
查询(由 Order_Id 单独运行)
update `Order`
join
(
select o.Order_Id,food.foodSum,drinks.drinkSum
from `order` o
cross join
( select ifnull(sum(Total_Price),0) as foodSum
from food_order
where Order_Id=1
) food
cross join
( select ifnull(sum(Total_Price),0) as drinkSum
from drink_order
where Order_Id=1
) drinks
where o.Order_id=1
) inr
on inr.Order_id=`Order`.Order_Id
set `Order`.Total_Price=(inr.foodSum+inr.drinkSum);
结果:
select * from `order`;
+----------+-------------+
| Order_Id | Total_Price |
+----------+-------------+
| 1 | 7.77 |
| 2 | 86.66 |
| 3 | 3000.00 |
+----------+-------------+
注意,Order_Id 可以与准备好的语句一起放入,或者存储过程可以接受一个参数,并以这种方式将其楔入。
cross join 指定没有连接子句。通常被认为是cartesian product,但在这种情况下,结果为 1*1*1 = 1 行。
所以它是join with update pattern,针对 1 行。
就数据而言,订单 1 没有饮料,订单 3 没有食物,订单 2 两者都有。我认为订单 3 很有趣。