使用左连接的MySQL Update Query

时间:2010-07-14 16:54:43

标签: mysql left-join

表架构

表名:file_manager_folder

行:idparentIdname

我的查询模拟将文件夹移动到另一个文件夹并使用IN(?)接受数组。

如果还没有一个具有相同parentId和name的文件夹,我希望我的更新只“移动”一个文件夹。您在任何普通文件系统下都会遇到的行为。

例如:

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

查询不会检查有关parentId和name的任何内容......但是如何让左连接工作。

这是我试过的一个..这完全不起作用。

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

4 个答案:

答案 0 :(得分:50)

因此,只有当目标父文件夹下的同名文件夹时,才想移动文件夹:

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)。

答案 1 :(得分: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 :(得分:2)

我认为应该使用parentidname列上的unique constraint/index来解决这个问题。否则,对表具有INSERT / UPDATE访问权限的任何人都可以规避您的业务规则。

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

答案 3 :(得分:0)

如果您使用 NOT IN 而非 LEFT join 会降低您的效果。

在查询之前运行说明,问题很明显。