Eu mostrei abaixo o que foi dito nos comentários da pergunta:
CREATE TRIGGER some_trigger AFTER UPDATE ON table_a
FOR EACH ROW BEGIN
DECLARE tname VARCHAR(20);
IF (NEW.field_offer=1) THEN
UPDATE `table_b`
SET STOCK = CASE NEW.field_state
WHEN 0 THEN STOCK - 1
WHEN 1 THEN STOCK + 1
ELSE STOCK
END
WHERE ID=NEW.ref_field
;
ELSEIF (NEW.field_offer=0) THEN
UPDATE `table_c`
SET STOCK = CASE NEW.field_state
WHEN 0 THEN STOCK - 1
WHEN 1 THEN STOCK + 1
ELSE STOCK
END
WHERE ID=NEW.ref_field
;
END IF;
...
Observe que alterei as atualizações de
UPDATE ... JOIN
pois o MySQL não permite alterar os dados da tabela acionada; enquanto você não estava realmente atualizando table_a, o JOIN poderia ter sido suficiente para o MySQL ter objetado... isso e as junções teriam atualizado todas as linhas em table_b/c
que teve uma correspondência em table_a
, não apenas table_a
linhas relacionadas aos valores em ou linha do gatilho.