php - SQL 树结构父子

标签 php mysql zend-framework recursion hierarchical-query

我有以下数据:

                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/

相关文章:

javascript - 响应式文件管理器出现tinyMCE上传错误

c# - UnityWebRequest 返回 "\u001f�\b"

php - TCPDF绘图打印机注册标记

php - 用户信息未保存到我的数据库中

php - Zend Framework 1.12 - 无法加载模块的模型

php - Zend_Registry 不工作!设置和获取

java - 将 PHP 前端连接到后端 java 服务

php - 从 mysql 获取日期时出现奇怪的结果

PHP/SQL : "false" value received from database with good query

zend-framework - Zend Session Handler Db 表在 PHPUnit 测试期间被破坏