用JOIN删除?

时间:2010-06-03 15:43:07

标签: mysql join sql-delete

这个问题让我很头疼。

我的数据库中有两个表,它们通过名为“Closure表”的设计解决了类别的排序问题。第一个表称为categories,另一个表名为categoriesPaths

类别只是一种基于语言的表格:

id | name
----------------
0  | Category 1
1  | Category 2

CategoriesPaths如下所示:

parent | children | level
-----------------------
1     | 1         | 0
1     | 2         | 1
2     | 2         | 0

要删除路径及其最终的子节点,我运行以下查询:($ top是删除开始时的顶级父节点级别)

DELETE d FROM CategoriesPaths children
JOIN CategoriesPaths a USING (children)
WHERE a.parent = $top;

我想要做的是更改查询以删除categories表中的代表路径。不幸的是我没有足够的SQL知识来执行此操作。我试图在查询之前使用foreach循环进行解决方法,但是无法删除,因为categories表被引用到categoriesPaths ... 据说,我几乎陷入困境。

如果有人希望了解关闭表设计的更多信息,请参阅我从以下网站获取的幻灯片共享:http://www.slideshare.net/billkarwin/sql-antipatterns-strike-back

2 个答案:

答案 0 :(得分:2)

好吧,我会采取不同的方式。

  1. 创建一个临时表,其中包含要删除的所有项目的ID
  2. 从临时表中删除CategoriesPaths
  3. 从临时表中删除类别
  4. 删除临时表。
  5. 像这样:

    -- not tested
    CREATE TABLE tmp_to_delete
    AS SELECT children.children
    FROM CategoriesPaths children
    JOIN CategoriesPaths a USING (children)
    WHERE a.parent = $top;
    
    DELETE FROM CategoriesPaths WHERE children IN (SELECT children FROM tmp_to_delete)
    DELETE FROM Categories WHERE id IN (SELECT children FROM tmp_to_delete)
    
    DROP TABLE tmp_to_delete
    

答案 1 :(得分:1)

为什么不使用交易? http://www.firstsql.com/tutor5.htm