2017-05-04 57 views
0

我想請求幫助和UPDATE命令,這取決於4個表的關係。 (或者甚至有可能MySQL SUM更新4個表

theese是我的表:?

Characters 
guid, ...., totalItemlevel 

template_items 
id, ... itemlevel, ..., 

instances_item 
itemInstanceID, itemID, Owner 
(itemID is foreign key template_items.id, Owner is foreign key Character.guid) 

inventory_character 
guid, slot, iteminstance 
(guid is foreign key character.guid, item is foreign key instances_item.itemInstanceID) 

現在我需要做一個更新腳本,將設置totalItemLevel爲template_items.itemLevel的總和,如果角色有實例在插槽的庫存該項目> 20

在僞聲明:

UPDATE characters 
SET totalItemLevel = SUM(FOR EACH ITEM IN INVENTORY(is slot>20?(GET its template(get itemLevel)))); 

所以我想這樣的事情

SELECT SUM(template_items.itemLevel) 
FROM template_items, 
     inventory_character, 
     instances_item, 
     characters 
WHERE chararacter.guid = inventory_character.guid 
AND  inventory_character.slot > 19 
AND  inventory_character.iteminstance = instances_item.itemInstanceID 
AND  instances_item.itemID = template_items.id); 

這絕對不行,它很瘋狂,它可能需要一些子查詢,但我真的不知道,如何實現這一點。

此外,我不能以其他方式做到這一點,就像在PHP中做一些查詢然後計算它一樣......我需要直接在數據庫中執行此更新。

那麼請你有什麼想法,如何實現這個計算列?

感謝提前:)

+1

它通常是一個壞主意存儲計算值(來自其他列)。請改爲創建一個視圖。 – jarlh

+0

一般來說,同樣的問題,我需要至少每個字符的SELECT值。所以,如果它是一個視圖,它將agan Characters.name和GS值作爲一個新表(視圖)從此,我可以做更新 – Zorak

回答

0

假設你需要插槽> 20(在您的文章,你有槽>在一個20在另一個地方和插槽> 19):

UPDATE Characters 
SET Characters.totalItemLevel = s FROM 
(
    SELECT SUM(template_items.itemlevel) AS s, c.[guid] 
    FROM Characters c 
    INNER JOIN inventory_character ON inventory_character.[guid] = c.[guid] 
    INNER JOIN instances_item ON instances_item.itemInstanceID = inventory_character.iteminstance AND instances_item.[Owner] = c.[guid] 
    INNER JOIN template_items ON template_items.id = instances_item.itemID 
    WHERE c.[guid] = instances_item.[Owner] AND slot > 20 
    GROUP BY c.[guid] 
) A 
WHERE Characters.[guid] = A.[guid]