穿越樹木深度嵌套子查詢我有我的數據庫中的表,我使用混合嵌套集合(MPTT)模型(其中有lft
和rght
值而確定一)和鄰接表模型(存儲存儲樹結構每個節點上的parent_id
)。在MySQL的
my_table (id, parent_id, lft, rght, alias)
這個問題不涉及任何的樹MPTT方面,但我想我會留在的情況下,任何人都有關於如何利用這是一個好主意。
我想將別名路徑轉換爲特定節點。例如:"users.admins.nickf"
將找到具有別名「nickf」的節點,該別名是具有別名「admins」的別名,該別名是位於根處的「用戶」的子節點。 (parent_id, alias)
上有一個唯一索引。
我開始寫的功能,所以它會在路徑拆分其各部分,然後通過一個查詢數據庫中的一個:
SELECT `id` FROM `my_table` WHERE `parent_id` IS NULL AND `alias` = 'users';-- 1
SELECT `id` FROM `my_table` WHERE `parent_id` = 1 AND `alias` = 'admins'; -- 8
SELECT `id` FROM `my_table` WHERE `parent_id` = 8 AND `alias` = 'nickf'; -- 37
但後來我意識到,我可以使用單個查詢做到這一點,利用嵌套的變量數量:
SELECT `id` FROM `my_table` WHERE `parent_id` = (
SELECT `id` FROM `my_table` WHERE `parent_id` = (
SELECT `id` FROM `my_table`
WHERE `parent_id` IS NULL AND `alias` = 'users'
) AND `alias` = 'admins'
) AND `alias` = 'nickf';
由於子查詢的數量依賴於在路徑的步數,我該怎麼用具有太多的子查詢遇到問題? (如果還有這樣的事情)
有沒有更好/更聰明的方法來執行這個查詢?
你爲什麼不建立一個測試表,並找出查詢(遞歸)棧有多深? – lexu 2010-05-28 04:11:52
不能夠使用最具區分性的選擇器('nickf')'感覺不正確'。也許如果通過連接查詢來構建它,而不是使用子查詢?這將避免遞歸(不是真的,但看起來像)=>級聯自加入! – lexu 2010-05-28 04:15:00
我寫了'自我加入級聯'的好奇心..看到我的答案。 – lexu 2010-05-28 04:28:25