2013-08-23 61 views
0

我有兩個MYSQL表「shirts_in_box」,「trousers_in_box」代表可以在同一個盒子裏的兩個不同類別的對象:襯衫和褲子,以及每個盒子的數量。複雜的SQL更新聲明

表 「shirts_in_box」 有我有應對以下情況列 「shirt_id,數量」 和 「trousers_in_box」 中的列 「trouser_id,數量」

1)我開始在box_id = 「foo」 的兩個項目:如表 「shirts_to_box」 有一排

shirt_id = 'xxx', quantity : '1' 

和 「trousers_to_box」 有一排

trouser_id = 'www', quantity : '2' 

2)項box_id =「富」的更新列表被提交時,它看起來像

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

您可以使用一般的表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 ...)

+0

感謝您的回覆!問題是襯衫和褲子ID是從其他桌子上出來的,所以我不能保證不會有id的重疊。另外我不認爲這會刪除不在框中新項目列表中的行 – Petrov

+0

最簡單的解決方案是使用兩個表:'item'和'item_type'(而不是'shirt','trouser '......)。然後,您不再需要'item_in_box.item_type'列,擁有不同的ID,並且能夠推廣您的代碼。 – zessx

+0

嗯,那麼item和item_type的列會是什麼? – Petrov