[英]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 反模式:避免數據庫編程的陷阱中看到比較這些方法的更多信息。
也許在 MySQL 中管理分層數據會有所幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.