2013-07-17 90 views
0

HI我有查詢選擇了主鍵(id)= 1或外鍵= 1的所有行。這是自己的連接。用JOIN自己更新MySql

選擇:

SELECT f2.wz AS wz FROM d7x6r_magazyn_faktura_zakupowa f 

         LEFT JOIN (SELECT id,id_glowna, wz FROM d7x6r_magazyn_faktura_zakupowa )AS f2 
         ON(((f2.id = f.id_glowna OR f2.id = f.id OR f2.id_glowna = f.id OR f2.id_glowna = f.id_glowna) 
         AND f2.id_glowna <> 0) 
         OR (f2.id = f.id OR f2.id = f.id_glowna)) 
         WHERE f.id = 1 OR f2.id_glowna = 1; 

現在我需要在所有行更新單元WZ爲0。我嘗試使用:

UPDATE d7x6r_magazyn_faktura_zakupowa f 

    LEFT JOIN (SELECT id,id_glowna, wz FROM d7x6r_magazyn_faktura_zakupowa )AS f2 
       ON(((f2.id = f.id_glowna OR f2.id = f.id OR f2.id_glowna = f.id OR f2.id_glowna = f.id_glowna) 
       AND f2.id_glowna <> 0) 
       OR (f2.id = f.id OR f2.id = f.id_glowna)) 

SET f2.wz = 0 
WHERE f.id = 1 OR f2.id_glowna = 1; 

但它不工作,因爲f2.wz無法更新。

回答

0

你必須創建TMP表,也LEFT JOIN不應該有

1

你似乎沒有需要的子查詢,並可以只使用JOIN: -

UPDATE d7x6r_magazyn_faktura_zakupowa f 
LEFT JOIN d7x6r_magazyn_faktura_zakupowa f2 
ON(((f2.id = f.id_glowna OR f2.id = f.id OR f2.id_glowna = f.id OR f2.id_glowna = f.id_glowna) 
AND f2.id_glowna <> 0) 
OR (f2.id = f.id OR f2.id = f.id_glowna)) 
SET f2.wz = 0 
WHERE f.id = 1 OR f2.id_glowna = 1; 

但是你有LEFT JOIN,但正在更新F2,這是可能不在那一行,所以INNER JOIN可能會更好

1

您可以在更新/插入/刪除上進行連接,但不會更新這些連接表中的記錄。

您可以使用觸發器雖然

DELIMITER $$ 

CREATE TRIGGER au_table1_each AFTER UPDATE ON table1 FOR EACH ROW 
BEGIN 
    UPDATE table2 SET fieldY = new.fieldX WHERE ...; 
END $$ 

DELIMITER ; 

的觸發條件會使用一些在表1的新數據的每次更新和更新表2做到這一點。 有觸發之前和行動之後,它可以是UPDATE,INSERT或DELETE

參見:http://dev.mysql.com/doc/refman/5.1/en/create-trigger.html 和:http://www.databasedesign-resource.com/mysql-triggers.html

感謝:mysql update, insert, delete with joins

+1

「你可以加入上更新/插入/刪除,但不更新這些連接表中的記錄。「爲什麼不? – Strawberry