2016-11-25 117 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