2010-07-14 48 views
22

表模式使用左側的MySQL更新查詢加入

表名:file_manager_folder

行:idparentIdname

我的查詢模擬一個文件夾移動到另一個文件夾,並接受一個數組使用IN(?)。

我想我的更新只是'移動'一個文件夾,如果還沒有一個文件夾具有相同的parentId和名稱。您在任何普通文件系統下所期望的行爲類型。

因此,例如:

UPDATE file_manager_folder set parentId = 54 where id IN('1','2',3') 

將不檢查有關的parentId和名稱的任何查詢......但我怎麼能得到左聯接工作。

這是一個我試過..這完全不起作用。

SELECT * FROM 
    file_manager_folders as a 
LEFT JOIN file_manager_folders as b on a.id = b.id 
WHERE b.id IS NOT NULL and a.id IN("1","2","3") and a.parentId = 54 

UPDATE table1 LEFT JOIN table2 SET t1.x = t2.y ON condition WHERE conditions

回答

46

所以,你要移動的文件夾只有當目標父文件夾下的同名文件夾不存在:

UPDATE file_manager_folder f1 
LEFT OUTER JOIN file_manager_folder f2 
    ON f1.name = f2.name AND f2.parentId = 54 
SET f1.parentId = 54 
WHERE f2.name IS NULL AND f1.id IN (1,2,3); 

連接條件在目標父級下搜索具有相同名稱的文件夾。 WHERE子句測試沒有這樣的文件夾存在(只有當外連接找不到匹配時,f2.name才爲null)。

+0

這完美的比爾。我可以看到我有基本的地方..只是令人難以置信的標誌!我不知道你是如此迅速地釘住了它。我無法弄清楚我想加入什麼。 – Layke 2010-07-14 18:06:08

2

那種幼稚但是如何呢?

UPDATE file_manager_folder SET parentId = 54 
WHERE id IN('1','2','3') 
AND parentId != 54 
AND name NOT IN (SELECT name FROM file_manager_folder WHERE id IN ('1', '2', '3')) 
2

我想這應該對parentidname列使用unique constraint/index來解決。否則,任何具有INSERT/UPDATE訪問權限的人都可以規避您的業務規則。

CREATE UNIQUE INDEX blah_uk ON FILE_MANAGER_FOLDER(parentId, name) USING BTREE 
0

如果使用NOT IN代替LEFT join降解你的表現。

運行在查詢之前解釋並且問題很明顯。