2016-07-06 66 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;