复杂的SQL更新声明

时间:2013-08-23 14:30:59

标签: mysql sql

我有两个MYSQL表“shirts_in_box”,“trousers_in_box”代表两个不同类别的物品,可以放在同一个盒子里:衬衫和裤子,以及每个盒子的数量。

表格“shirts_in_box”包含“shirt_id,quantity”列和“trousers_in_box”列“trouser_id,quantity”

我必须处理以下情况:

1)我从box_id =“foo”中的两个项开始:例如表“shirts_to_box”有一行

shirt_id = 'xxx', quantity : '1'

和“trousers_to_box”有一行

trouser_id = 'www', quantity : '2'

2)提交了box_id ='foo'的项目更新列表,类似于

trousers_to_box :

box_id : foo, trousers_id : 'aaa', quantity : '5'

shirts_to_box :

box_id : foo, shirts_id : 'xxx', quantity : '2'

3)我应该拿这个并更新“shirts_to_box”,“trousers_to_box”,以便上面是两个表中包含box_id ='foo'的所有条目,即

shirts_to_box :

UPDATE shirt_id = 'xxx', quantity : '1' to quantity = 2

trousers_to_box :

ADD trouser_id = 'aaa', quantity : '5'
DELETE trouser_id = 'www', quantity : '2'

目前,我的方法效率不高。我在两个单独的表上进行了两次单独的查询,并分别对每个表进行添加/更新/删除。

有没有办法在一个查询中完成所有操作?或者甚至比我现在得到的更有效的方式?

1 个答案:

答案 0 :(得分:1)

你可以使用一般表格item_in_box所有项目的ID不同(你的裤子和衬衫的ID不同):

-----------------------------------------------
 BOX_ID  |  ITEM_ID  |  ITEM_TYPE  |  QUANTITY
-----------------------------------------------
 foo     |  xxx      |  shirt      |  1
 foo     |  www      |  trouser    |  2
-----------------------------------------------

然后,当您获得foo框的更新时,您只需使用此类请求:

UPDATE item_to_box
SET `quantity` = CASE `item_id`
    WHEN xxx THEN 5
    WHEN yyy THEN 2
END

新列item_type未在您的更新中使用,但有助于区分您的商品。

修改

为了完全概括您的代码,我建议您这样做: enter image description here

保留您的表格shirttrouser,但请使用中间人:item。你现在只需要一个UPDATE请求,无论你有多少项目类型(我在上面写的那个)。

注意:item.type列是可选的,您可以使用它来快速了解项目的类型,而无需查询所有子表(trousershirt .. 。)