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) |