使用閉包表查詢樹狀結構數(shù)據(jù)
問題:
需要根據(jù)樹狀表結構模糊查詢數(shù)據(jù),保留符合條件的層級,例如:有表字段為 id、parent_id 和 name,想要根據(jù) name 模糊查詢出 “%肉%” 相關的層級,并只顯示查詢結果的相關層級。
解決方案:
建議使用閉包表來解決此問題。創(chuàng)建一個名為 tree 的表,它包含以下列:
- self:當前節(jié)點的 id。
- parent:當前節(jié)點的父節(jié)點 id。
- distance:當前節(jié)點到根節(jié)點的距離。
通過這種方式,你可以將樹以閉包的形式存儲在表中。
步驟:
- 生成閉包表:
create table tree(self int, parent int, distance int);
- 將樹狀數(shù)據(jù)插入閉包表中:
你可以通過遍歷樹結構逐行插入數(shù)據(jù)。
- 根據(jù)條件查詢數(shù)據(jù):
select * from tree where self like '%肉%';
- 在代碼中按 self 分類并合并樹:
from itertools import groupby root = {} for _, path in groupby(from_datebase, key=lambda x: x[0]): path = sorted(list(path), key=lambda x: -x[2]) node = root for _, nodeName, _ in path: node = node.setdefault(nodeName, {})
其他注意事項:
- 在實際使用中,不要直接映射中文,應該為每個分類分配一個 id。
- 閉包表的存儲空間會隨著樹的層級深度成倍增加,但在大多數(shù)情況下這并不會影響性能。
- 插入、更新和刪除等操作都需要重寫,工作量較大,但這種方法是一種相對規(guī)范的做法。
? 版權聲明
文章版權歸作者所有,未經允許請勿轉載。
THE END