我對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);
這導致了一切被查詢,綁在桌子長一倍作爲未改變的表(顯然不是我正在尋找的)
我很確定我只是在做我的查詢出了問題,所以我只是希望有人能糾正我的錯誤,指向正確的方向。
我知道這應該是更容易使用嵌套集模型,但我只是不喜歡該選項添加新選項的困難。
謝謝你的快速回復!這幾乎是完美的;我怎麼能限制它只抓住特定的孩子,例如,如果我只想在上面的例子中的'軟件'的孩子? – Bitwize
添加where子句,指定父級必須具有一段「軟件」: SELECT c1。*,c2.id FROM category c1 INNER JOIN類別c2 ON(c1.parent = c2.id)WHERE c2.section ='軟件'; – keelerm
完美! 非常感謝。在嘗試之前,我試着添加一個where子句,但我必須把它放在錯誤的地方;這工作完美雖然。 – Bitwize