的結果,選擇我有一個表,看起來是這樣的:從相同的查詢
id parent_id name
1 0 page #1
2 1 Page #2
3 1 Page #3
4 2 Page #4
* PARENT_ID *被realated到ID。
頁面#4是頁面#2的子頁面 和頁面#2是頁面#1的子頁面 ,頁面#3也是如此。
我需要一個mysql查詢,可以讓所有的孩子,說ID 1. 這將返回所有這些頁面,因爲所有頁面「主父母」(哈哈)是頁面#1。
的結果,選擇我有一個表,看起來是這樣的:從相同的查詢
id parent_id name
1 0 page #1
2 1 Page #2
3 1 Page #3
4 2 Page #4
* PARENT_ID *被realated到ID。
頁面#4是頁面#2的子頁面 和頁面#2是頁面#1的子頁面 ,頁面#3也是如此。
我需要一個mysql查詢,可以讓所有的孩子,說ID 1. 這將返回所有這些頁面,因爲所有頁面「主父母」(哈哈)是頁面#1。
你基本上有兩種選擇:
使用遞歸,無論是在你的應用程序邏輯或查詢,如果您的RDBMS支持
在每個節點上存儲的左/右值的樹,它可以讓你輕鬆找到一個節點
這兩項方案都覆蓋在sitepoint的優秀文章的所有子樹,http://www.sitepoint.com/hierarchical-data-database/(但它不包括RDBMS遞歸,你可能不支持)
謝謝,我會盡力的。 – Patrik
想到我只是爲這個問題留下了一個解決方案。不只是在MySQL中,但與PHP。
這是一個函數,它自己調用它來檢查當前頁面(在循環中)是否有孩子。 它將返回一個包含所有子項(包括父項)標識的數組。
public function getPageChildren($parent_id) {
$result = mysqli_query($con, 'SELECT id FROM pages WHERE parent_id = '.$parent_id);
while($children = mysqli_fetch_assoc($result)) {
if($children) {
$childrenArray[] = $children['id'];
$childrensChildren = getPageChildren($children['id']);
foreach($childrensChildren as $childrensChild) {
$childrenArray[] = $childrensChild;
}
}
}
return $childrenArray;
}
http://stackoverflow.com/questions/990529/mysql-how-to-find-all-ids-of-children-recursively –