通过递归查询获取叶节点

时间:2011-09-23 12:05:48

标签: php mysql recursion

我有一个类别结构如下

enter image description here

我想选择叶子节点。我指的是没有子类别的类别。

在我的数据库监视器中,将回答cpu,小说和漫画。

任何帮助将不胜感激。

编辑: 我试过这个。

public function get_valid_categories($parent)
        {
                $has_childs = false;
                foreach($this->categories as $key => $value) {
                    if ($value['parent'] == $parent) {
                        if ($has_childs === false) {
                            $has_childs = true;
                        }
                        else
                        {
                            $this->valid_categories[] =  $value['name'];
                        }
                        $this->get_valid_categories($key);

                    }
                }
                if ($has_childs === true)
                {
                    return $this->valid_categories ;
                }
        }

我正在调用此函数,如下所示

get_valid_categories(0);

2 个答案:

答案 0 :(得分:3)

您不需要递归查询。以下SQL如何:

select t1.* 
from table t1
    left join table t2 on t1.id = t2.parent_id
where t2.id is null

这会获取表中的行和自连接以获取每一行的子项。然后,它会通过检查t2.id is null来过滤掉那些没有子项的行。

答案 1 :(得分:2)

嗯,可能有很多可能的解决方案,但这是第一个出现在我脑海中的解决方案:

SELECT *
FROM categories
WHERE id NOT IN (
                 SELECT DISTINCT(parent_id) FROM categories
                )

不如使用连接那么优雅,但可以作为问题的替代解决方案。 希望有所帮助。