我有以下数据:
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 产品提供内置的分层查询。例如,Oracle SQL has START WITH ... CONNECT BY
语法,您可以在其中使用此类查询来获取结果。
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。你必须以某种方式伪造它。一种方法是检索数据并在应用程序的内存中构建层次结构。
另一种方法是使用一系列比预期的层次结构深度更长的 LEFT JOIN 操作。这个查询有点难看,但它有效。此类查询的每一行都包含该行的“谱系”。以下是您的数据示例 ( http://sqlfiddle.com/#!2/bab1d/4/0 ):
select a.id a, b.id b, c.id c, d.id d, e.id e, f.id f, g.id g /*MySQL*/
from res a
left join res b on a.parent_id = b.id
left join res c on b.parent_id = c.id
left join res d on c.parent_id = d.id
left join res e on d.parent_id = e.id
left join res f on e.parent_id = f.id
left join res g on f.parent_id = g.id
where a.id = 'PhoneBook'
此特定查询的结果是
| A | B | C | D | E | F | G |
|-----------|--------------------|---------|--------|--------|--------|--------|
| PhoneBook | TextWritingProggie | Printer | Editor | (null) | (null) | (null) |
在 Oracle 分层查询中编码到 CONNECT BY PRIOR id =parent_id
中的逻辑在此处显示为重复 LEFT JOIN< 的重复
ON
子句。/code> 操作。
关于php - SQL 树结构父子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28709905/