簡體   English   中英

在 MySQL 中檢索具有層次結構的數據

[英]Retrieving data with a hierarchical structure in MySQL

鑒於下表

id    parentID   name      image
0     0                    default.jpg
1     0          Jason   
2     1          Beth      b.jpg
3     0          Layla     l.jpg
4     2          Hal     
5     4          Ben       

我想做以下事情:

如果我搜索 Ben,我想找到圖像,如果沒有圖像,我想找到父母的圖像,如果不存在,我想去祖父母的圖像......直到我們點擊默認圖像。

執行此操作的最有效方法是什么? 我知道 SQL 並不是真正為分層值而設計的,但這是我需要做的。

干杯!

MySQL 缺少遞歸查詢,這是標准 SQL 的一部分。 許多其他品牌的數據庫支持此功能,包括 PostgreSQL(請參閱http://www.postgresql.org/docs/8.4/static/queries-with.html )。

在 MySQL 中有幾種處理分層數據的技術。

  • 最簡單的方法是添加一列來記錄給定照片所屬的層次結構。 然后您可以搜索屬於同一層次結構的照片,將它們全部提取回您的應用程序並找出您需要的照片。 這在帶寬方面有點浪費,需要你編寫更多的應用程序代碼,如果你的樹有很多節點,那就不好了。

還有一些巧妙的技術來存儲分層數據,以便您可以查詢它們:

  • 路徑枚舉存儲每個節點的祖先列表。 例如,您示例中的照片 5 將存儲“0-2-4-5”。 您可以通過搜索路徑與“%”連接的節點與帶有LIKE謂詞的 5 路徑匹配來搜索祖先。

  • 嵌套集是一種復雜但聰明的技術,由 Joe Celko 在他的文章和他的書“Trees and Hierarchical in SQL for Smarties”中推廣。 也有許多關於它的在線博客和文章。 查詢樹很容易,但很難查詢直接的子節點或父節點,並且很難插入或刪除節點。

  • Closure Table涉及將每個祖先/后代關系存儲在單獨的表中。 如果添加路徑長度列,則可以輕松查詢樹,易於插入和刪除,並且可以輕松查詢直接父級或子級。

您可以在我的演示文稿SQL 中的實用面向對象模型或我即將出版的書SQL 反模式:避免數據庫編程的陷阱中看到比較這些方法的更多信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM