在mysql或php中获取父级的所有后代?

时间:2017-01-12 22:35:10

标签: php mysql parent

希望能有一些帮助。假设我有一个像这样的mysql表

ID | Content | Parent ID |
2  | A       | 0
3  | A       | 2
4  | A       | 3  
5  | A       | 4
6  | A       | 10
7  | A       | 0
8  | A       | 7
9  | A       | 8
10 | A       | 9

我想要ID 2的所有后代。

3是孩子。孙子将是父母ID为3的任何帖子。依此类推。

在这种情况下,ID 2的后代为ID's 3, 4 and 5

ID 7的后代是ID's 8, 9, 10 and 6

无论如何,我可以在MySQL中查询这一点,对祖先的深度没有限制吗?或者甚至在php中迭代结果集?

非常感谢。

3 个答案:

答案 0 :(得分:1)

getTree()将返回带有嵌套子级的父级节点。您可能需要根据您的框架更改PHP mysql查询。

public function getTree($nodeId) {
    $mainNode = $this->db->select('id, content')->from('table_name')->where('id', $nodeId)->get()->first_row();
    $this->recur($mainNode);
    return $mainNode;
}

public function recur(&$node) {
    $q = $this->db->select('id, content')->from('table_name')->where('parent_id', $node->id)->get();
    if($q->num_rows() == 0) {
        return;
    }

    if($q->num_rows() > 0) {
        $node->children = $q->result(); // array of all child nodes
        foreach ($node->children as $u) {
            $this->recur($u);
        }
    }
}

答案 1 :(得分:0)

您可以这样完成:(我将使用伪代码给您一个大概的想法)

form do |f|
  f.inputs "Détails Utilisateurs" do 
    f.input :user
  end
  f.inputs "Accès" do
    offer.documents.each do |document|
      f.input document,
        label: document,
        as: :boolean do
          f.check_box document, {}, "true", "false"
        end
    end
  end
  f.buttons 
end

答案 2 :(得分:-3)

您必须规范化您的数据库 https://en.wikipedia.org/wiki/Database_normalization

我理解你的问题:

论坛(家长)
  ----第一届论坛----
  forum_id = 1
  forum_name = php

主题(儿童)

---- First Record ----
  thread_id = 20
  forum_id = 1
  ----下一条记录----
  thread_id = 21
  forum_id = 1

发布(孙子)

然后您使用联接来上下访问 例如,使用规范化数据库 如果你在线程表中,你可以访问它所属的论坛 以及特定主题中的帖子都在一个查询中