2016-07-06 31 views
0

我正在嘗試進行查詢以避免使用太多的php。我想更新世界1的行(木材,小麥,金,肉),通過增加這些值的表升級的值。這是據我可以得到:用兩個表之間的操作更新表的行

SELECT wood_cancel, wheat_cancel, gold_cancel, meat_cancel FROM upgrading WHERE world = 'world1' AND player_id = 190 AND city_id = 1 AND cancel_id = 'cancel_wood_rate_1'; 
UPDATE world1 SET wood = wood + wood_cancel, wheat = wheat + wheat_cancel, gold = gold + gold_cancel, meat = meat + meat_cancel WHERE player_id = 190 AND city_id = 1; 
DELETE FROM upgrading WHERE world = 'world1' AND player_id = 190 AND city_id = 1 AND cancel_id = 'cancel_wood_rate_1'SELECT wood_cancel, wheat_cancel, gold_cancel, meat_cancel FROM upgrading WHERE world = 'world1' AND player_id = 190 AND city_id = 1 AND cancel_id = 'cancel_wood_rate_1'; 

SQL錯誤消息稱wood_cancel,wheat_cancel,gold_cancel和meat_cancel無法找到。我應該如何繼續?

我需要使用某種JOIN嗎?如果是這樣,怎麼樣?

回答

1

你可以做UPDATE用類似的語法JOIN因爲這樣做選擇這樣當JOIN:

UPDATE world1 w INNER JOIN upgrading u 
ON w.player_id = u.player_id AND w.city_id = u.city_id 
SET w.wood = w.wood + u.wood_cancel 
WHERE u.world = 'world1' AND u.player_id = 190 
AND u.city_id = 1 AND u.cancel_id = 'cancel_wood_rate_1'; 

DELETE FROM upgrading 
WHERE world = 'world1' AND player_id = 190 
AND city_id = 1 AND cancel_id = 'cancel_wood_rate_1'; 

http://sqlfiddle.com/#!9/242f8/2

0

發生此錯誤的原因是因爲來自一個語句的值不會傳遞到沒有JOIN或其他類似語句的其他語句。即MySQL不知道wood_cancel來自前面的SELECT聲明。

MySQL的確具有user-defined variables的概念。使用這種類型的方法,您只需在開頭插入來自PHP的值。

就我個人而言,我會將所有的邏輯轉移到PHP中,以便在數據庫級別沒有任何邏輯發生。

注:未經測試。

SET @world = 'world1' 
    @player_id = 190, 
    @city_id = 1, 
    @cancel_id = 'cancel_wood_rate_1', 
    @wood_cancel = 0, 
    @wheat_cancel = 0, 
    @gold_cancel = 0, 
    @meat_cancel = 0 

SELECT 
    @wood_cancel := wood_cancel, @wheat_cancel := wheat_cancel, @gold_cancel := gold_cancel, @meat_cancel := meat_cancel 
FROM 
    upgrading 
WHERE 
    world = @world 
AND player_id = @player_id 
AND city_id = @city_id 
AND cancel_id = @cancel_id; 

UPDATE 
    world1 
SET 
    wood = wood + @wood_cancel, 
    wheat = wheat + @wheat_cancel, 
    gold = gold + @gold_cancel, 
    meat = meat + @meat_cancel 
WHERE 
    player_id = @player_id 
AND city_id = @city_id; 

DELETE FROM 
    upgrading 
WHERE 
    world = @world 
AND player_id = @player_id 
AND city_id = @city_id 
AND cancel_id = @cancel_id; 
相關問題