【问题标题】:MySQL Update Query using a left join使用左连接的 MySQL 更新查询
【发布时间】:2010-07-14 16:54:43
【问题描述】:

表架构

表名:file_manager_folder

行:idparentIdname

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

如果还没有具有相同 parentId 和名称的文件夹,我希望我的更新仅“移动”一个文件夹。在任何普通文件系统下您所期望的那种行为。

例如:

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

【问题讨论】:

    标签: mysql left-join


    【解决方案1】:

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

    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 才为空)。

    【讨论】:

    • 那是完美的比尔。我可以看到我已经具备了基础知识……简直太离谱了!我不知道你怎么这么快就搞定了。我不知道我想加入什么。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      有点天真,但是这个怎么样?

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

      【讨论】:

        【解决方案4】:

        如果您使用 NOT IN 而不是 LEFT join 会降低性能。

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

        【讨论】:

          猜你喜欢
          • 2017-04-22
          • 2011-03-02
          • 1970-01-01
          • 1970-01-01
          • 2022-11-11
          • 1970-01-01
          • 2015-12-30
          • 1970-01-01
          • 2017-04-04
          相关资源
          最近更新 更多