2016-11-25 127 views
0

我一直在构建PHP网页很长一段时间了,但我对MySQL数据库并不熟悉。我已经彻底地寻找了像我这样的问题的解决方案,但没有任何运气(尽管有类似的问题回答,我无法弄清楚如何实施提供的解决方案)。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属于),它应该以树状结构返回该级别的父级和子级记录。

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

重点是查看选定项目的完整历史记录。这甚至有可能与一个查询...?任何建议,欢迎和赞赏!

回答

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或类似的过滤。请注意,您目前的设计具有巨大的冗余潜力!

+0

感谢您的快速回复和示例!看起来我是在同一条路径上:我试过了LEFT JOIN(没有UNION,因为这些表有不同的列数),但是不知道如何过滤返回的数据集。你如何区分不同的层次来构建一个树形结构?还有,你能指出我设计的弱点吗('巨大的冗余')? – laciii

+0

作为冗余的一个例子,如果一个联系人与多个项目相关联,该怎么办?据我所知,这里没有“关卡”,但请参阅http://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to -ME将要-A-极简单的SQL查询 – Strawberry