2012-03-29 101 views
3

我有一個層次結構樣式的MySQL數據庫設置。有4個表稱爲pagesregions,elementscontent。頁面位於頂部,內容位於底部。MySQL刪除層次結構中的所有「子」元素

爲了簡化:具有柱

的網頁:

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,這裏是我的最終解決方案(基本丘爾克古爾馬的代碼,修改一點點):

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

使用'ON DELETE CASCADE' – zerkms 2012-03-29 01:40:36

回答

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 
+0

如果您在創建表時設置了刪除級聯表,則應刪除所有內容。但是,如果您沒有級聯刪除,那麼您必須創建四個不同的刪除語句。哈哥在我的前幾秒發佈了他的答案,但是他的答案與我的答案非常相似。 – Churk 2012-03-29 01:55:39

+1

實際上,如果您在級聯上刪除,您只需刪除pages.id = 1的頁面;剩下的表格將刪除其行。如果您必須能夠使用刪除級聯設置表,請參閱以下參考howto:http://www.java2s.com/Tutorial/MySQL/0080__Table/FOREIGNKEYONDELETECASCADEONUPDATECASCADE.htm – Churk 2012-03-29 01:57:40

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 
+0

謝謝,這是比我的第一個查詢可能更有效。但是,它並沒有解決選擇(當然是能夠刪除)所有數據而不僅僅是子數據的問題。 – Coolist 2012-03-29 01:46:32