2013-04-02 24 views
1

我對MySQL表的當前模型有困難,即我似乎無法正確查詢特定父節點的所有子節點。正如標題所述,我正在使用鄰接模型。使用MySQL中的鄰接模型獲取父節點的子節點

問題是,我在網上找到的大多數方法要麼查詢所有葉節點,要麼選擇更多的不僅僅是我試圖抓住的東西。

我後面的第一個教程是關於MikeHillyer.com,他的解決辦法是效果:

SELECT t1.name FROM 
category AS t1 LEFT JOIN category as t2 
ON t1.category_id = t2.parent 
WHERE t2.category_id IS NULL; 

的問題,這一點,是它查詢所有的葉節點,而不僅僅是那些相關給父母。他還建議使用嵌套集模型,我不希望使用嵌套集模型,因爲它插入新節點有點困難(我意識到這是重要的,但我不想必須使用訴諸它)。

我發現的下一個解決方案是在幻燈片53上共享的slideshow(在StackOverflow的另一個答案中找到)。這個解決方案應該查詢一個節點的直接子節點,這個解決方案似乎不適合我。

這裏是他們的解決方案:

SELECT * FROM Comments cl 
LEFT JOIN Comments c2 
    ON(c2.parent_id = cl.comment_id); 

現在,我的表是有一點不同,所以我調整了部分代碼它。我的表的簡要摘錄如下:

Table: category 
id | parent | section | title | ... 
----+--------+----------+----------+----- 
1 | NULL | home  | Home  | ... 
2 | NULL | software | Software | ... 
3 | 2 | software | Desktop | ... 
4 | 2 | software | Mobile | ... 
5 | NULL | about | About | ... 
6 | 5 | about | Legal | ... 
... | ... | ...  | ...  | ... 

當我修改了上面的查詢,我做了以下內容:

SELECT * FROM category cat1 
LEFT JOIN category cat2 
    ON(category.parent = cl.id); 

這導致了一切被查詢,綁在桌子長一倍作爲未改變的表(顯然不是我正在尋找的)

我很確定我只是在做我的查詢出了問題,所以我只是希望有人能糾正我的錯誤,指向正確的方向。

我知道這應該是更容易使用嵌套集模型,但我只是不喜歡該選項添加新選項的困難。

回答

2

看起來你很親密。您的左連接保證將返回表中的所有記錄。

請參閱下面的查詢。

SELECT c1.*, c2.id FROM category c1 INNER JOIN category c2 ON (c1.parent = c2.id); 
+0

謝謝你的快速回復!這幾乎是完美的;我怎麼能限制它只抓住特定的孩子,例如,如果我只想在上面的例子中的'軟件'的孩子? – Bitwize

+0

添加where子句,指定父級必須具有一段「軟件」: SELECT c1。*,c2.id FROM category c1 INNER JOIN類別c2 ON(c1.parent = c2.id)WHERE c2.section ='軟件'; – keelerm

+0

完美! 非常感謝。在嘗試之前,我試着添加一個where子句,但我必須把它放在錯誤的地方;這工作完美雖然。 – Bitwize

相關問題