2016-07-06 3 views
0

Я пытаюсь сделать запрос, чтобы избежать необходимости использовать слишком много php. Я хотел бы обновить строки world1 (дерево, пшеница, золото, мясо), добавив к этим значениям значения таблицы обновление. Это, насколько я мог бы получить: сообщение об ошибкеОбновление строк таблицы с операциями между двумя таблицами

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 не может быть найдено. Как мне продолжить?

Должен ли я использовать какую-то СОЕДИНЕНИЕ? Если да, то как?

ответ

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; 
Смежные вопросы