Php SQL树结构父子

Php SQL树结构父子,php,mysql,zend-framework,recursion,hierarchical-query,Php,Mysql,Zend Framework,Recursion,Hierarchical Query,我有以下数据: id parent_id ------------------ ------------------ Editor null Printer Editor TextWritingProggie Printer

我有以下数据:

                id                  parent_id           
                ------------------  ------------------  
                Editor              null
                Printer             Editor
                TextWritingProggie  Printer
                LaTeX               TextWritingProggie
                OOfficeWriter       TextWritingProggie
                PhoneBook           TextWritingProggie
我正在查询电话簿id及其所有父项。它应该是一个层次结构,导致编辑器,因为他的父项为空,并且他通过打印机连接,打印机通过TextWritingProggie连接,而后连接到电话簿

我认为更倾向于使用SQL,但它可能需要通过PHP处理

这是我到目前为止得到的结果,但它在不包含TextWritingProggie的记录后停止

SELECT * FROM acl_resources 
WHERE id = 'TextWritingProggie' OR parent_id = 'TextWritingProggie' 
ORDER BY COALESCE(parent_id, id), parent_id IS NOT NULL, id

任何帮助都会很好

一些RDBMS产品提供内置的分层查询。例如,以…开头。。。按语法连接,您可以使用这种查询来获得结果

 SELECT id, SYS_CONNECT_BY_PATH(parent_id, '/'), LEVEL -- Oracle
   FROM res
  WHERE id='PhoneBook'
CONNECT BY prior id=parent_id
  ORDER BY LEVEL DESC
但不是MySQL。你得想办法假装一下。一种方法是检索数据并在应用程序内存中构建层次结构

另一种方法是使用比层次结构的预期深度更长的左连接操作序列。这个查询有点难看,但它可以工作。此类查询的每一行都包含该行的系谱。以下是您的数据示例:

此特定查询的结果是

|         A |                  B |       C |      D |      E |      F |      G |
|-----------|--------------------|---------|--------|--------|--------|--------|
| PhoneBook | TextWritingProggie | Printer | Editor | (null) | (null) | (null) |

Oracle分层查询中编码为CONNECT BY PREVIR id=parent_id的逻辑在此处显示为重复左连接操作的REPECTED ON子句。

另一种方法的可能重复是使用存储过程伪造递归连接,如中所述。因此,我需要创建一个具有确切父连接数目的查询?如果它超出了g呢?正如我所写的,要对左连接操作序列使用这种俗气的技术,序列需要与层次结构的预期深度一样长或更长。如果层次结构太深,它将不会显示某些项的整个继承列表。
|         A |                  B |       C |      D |      E |      F |      G |
|-----------|--------------------|---------|--------|--------|--------|--------|
| PhoneBook | TextWritingProggie | Printer | Editor | (null) | (null) | (null) |