2017-05-04 12 views
0

4つのテーブルの関係に依存するUPDATEコマンドとUPDATEコマンドについて助けを求めます。 (あるいは、それも可能です4つのテーブルでMySQL SUMを更新する

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) 

は、今私はUPDATEスクリプトを実行する必要があり、文字はのインスタンスを持っている場合、template_items.itemLevelの和としてtotalItemLevelを設定することその項目は、擬似声明でスロット> 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(投稿にあなたが別で> 19 1位とスロットにスロット> 20を持っている)必要があると仮定すると:それは一般的に悪い考えです

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] 
関連する問題