在单列中管理父子层次结构

时间:2017-07-14 06:47:11

标签: php mysql

我必须进行查询以选择父项为SFI且ID为1的数据,然后删除浴缸,破解并分解SFI的儿童和淋浴盆,木地板,分手是分手的孩子。

表的结构。 (SOR表)

sor_id | items       | parent_id
-------------------------
 1 | SFI         | 0
 2 | Remove bath | 1
 3 | Hack off    | 1
 4 | break up    | 1
 5 | Shower tray | 4
 6 | Timber floor| 4
 7 | screeded    | 4
 8 | general 123 | 1

所以我的问题是,我们可以使用两次自连接,并在php循环中进行一些训练以实现此结果吗?

坦率地说,我不知道我们可以用一个parent_id来管理这个层次结构,

select * from sor as m_sor 
LEFT JOIN sor as c_sor ON m_sor.sor_id = c_sor.parent_id
LEFT JOIN sor as sc_sor 0N sc_sor.sor_id = c_sor.parent_id

1 个答案:

答案 0 :(得分:0)

根据@RamRaider的指令,mysql不支持递归查询。我无法改变表格结构。 所以我做了一个递归函数。 首先,我选择了数据库中的所有数据,并使用下面的recursive php函数。

function buildTree( $ar, $pid = 0 ) {
            $op = array();
            foreach( $ar as $item ) {
                if( $item['parent_id'] == $pid ) {
                    $op[$item['sor_id']] = array(
                        'sor_id' => $item['sor_id'],
                        'item_no' => $item['item_no'],
                        'price' => $item['price'],
                        'base_qty' => $item['base_qty'],
                        'description' => $item['description'],
                        'type' => $item['type'],
                        'form_name' => $item['form_name'],
                        'status' => $item['status'],
                        'modified_date' => $item['modified_date'],
                        'parent_id' => $item['parent_id']
                    );
                    // using recursion
                    $children =  buildTree( $ar, $item['sor_id'] );
                    if( $children ) {
                        $op[$item['sor_id']]['children'] = $children;
                    }
                }
            }
            return $op;
}

所以,它起作用并返回了我想要的结果。