mysql层次结构递归查询

时间:2016-11-25 08:23:01

标签: php mysql recursion hierarchical-data

我一直在构建PHP网页已有一段时间了,但我并不熟悉MySQL数据库。我已经彻底搜索了像我这样的问题的解决方案,但没有任何运气(尽管有类似的问题得到解答,我无法弄清楚如何实现所提供的解决方案)。

我在3级分层结构中有5个表,如下所示:

Clients (id, name, ...)
 ↳ Projects (id, client_id, name, ...)
   ↳ Contacts (id, project_id, name, ...)
   ↳ Files (id, project_id, name, ...)
   ↳ Events (id, project_id, name, ...)

我试图通过扭曲来实现递归查询:如果我提供任何级别的ID(指定ID所属的级别),它应该返回树级结构中父级和子级记录的级别。

例如:我有一个Project的ID,所以我想返回Project所属的Client(父级),以及Project的Contacts,Files和Events(子级)。或者,如果我有一个事件的ID,那么我想输出项目(父),客户(父母),以及联系人和文件(与事件处于同一级别)。

重点是查看所选项目的完整历史记录。一个查询是否可以实现这一点......?任何建议都欢迎和赞赏!

1 个答案:

答案 0 :(得分:0)

这样的查询将返回整个数据集:

SELECT columns
     , I
     , actually
     , want
   FROM clients c
  LEFT
  JOIN projects p
    ON p.fk = c.pk
  LEFT 
  JOIN 
     ( SELECT 'contact' type, common, columns FROM contacts
        UNION
       SELECT 'file', etc
       UNION etc
     ) x
    ON x.fk = p.pk;

您可以轻松地将WHERE子句附加到此,或者,如果数据集不是很大,则只需处理JavaScript或类似的过滤。请注意,您当前的设计有可能产生巨大的冗余!