MySQL删除层次结构中的所有“子”元素

时间:2012-03-29 01:34:54

标签: mysql

我有一个层次结构样式的MySQL数据库设置。共有4个表格pagesregionselementscontent。页面位于顶部,内容位于底部。

简化:

页面包含以下列:

id

区域包含以下列:

id
page_id

元素包含以下列:

id
region_id

内容包含以下列:

id
element_id

我希望能够仅使用页面的ID 删除所有页面的子项。

到目前为止,我已经能够使用嵌套的select语句使用页面的id选择底部内容,但这不会选择元素,区域或页面。

SELECT * FROM `content` WHERE `element_id` IN (
    SELECT `id` FROM `elements` WHERE `region_id` IN (
        SELECT `id` FROM `regions` WHERE `page_id` IN (
            SELECT `id` FROM `pages` WHERE `id` = 1
        )
    )
) 

无论如何要有效地做到这一点?感谢。


感谢@Hago和@Churk,这是我的最终解决方案(基本上是Churk的代码,有点修改):

DELETE `content`, `elements`, `regions` FROM `content`
JOIN `elements` ON `elements`.`id` = `content`.`element_id`
JOIN `regions` ON `regions`.`id` = `elements`.`region_id` 
JOIN `pages` ON `pages`.`id` = `regions`.`page_id`
WHERE `pages`.`id` = 1

2 个答案:

答案 0 :(得分:3)

DELETE FROM content
JOIN elements ON elements.id = content.element_id
JOIN regions ON regions.id = elements.region_id 
JOIN pages ON pages.id = regions.page_id
WHERE pages.id = 1

答案 1 :(得分:0)

内部联接可能比多个嵌套子查询更有效,请尝试此

select 
    c.id 
from 
    contents as c 
inner join 
    elements as e on c.element_id = e.id 
inner join 
    regions as r on e.region_id = r.id 
where 
    r.page_id = 1