mysql 查詢樹狀結(jié)構(gòu)數(shù)據(jù)的優(yōu)化
要查詢樹狀結(jié)構(gòu)數(shù)據(jù)的層級(jí),通常需要使用遞歸或閉包表等方法。
閉包表
建議使用閉包表來優(yōu)化此查詢,其結(jié)構(gòu)如下:
create table tree( self int, parent int, distance int );
插入示例數(shù)據(jù)并按 self 分類合并形成樹:
from_database = [ ["雞肉", "雞肉", 0], ["雞肉", "肉類", 1], ["雞肉", "食物", 2], ["肉類", "肉類", 0], ["肉類", "食物", 1], ] from itertools import groupby root = {} for _, path in groupby(from_database, key=lambda x: x[0]): path = sorted(list(path), key=lambda x: -x[2]) node = root for _, nodename, _ in path: node = node.setdefault(nodename, {}) print(root) # {'食物': {'肉類': {'雞肉': {}}}}
查詢
使用 like 查詢帶肉的字段,結(jié)果如下:
select * from tree where self like '%肉%';
+------+---------+----------+ | self | parent | distance | +------+---------+----------+ | 肉類 | 肉類 | 0 | | 肉類 | 食物 | 1 | | 雞肉 | 雞肉 | 0 | | 雞肉 | 肉類 | 1 | | 雞肉 | 食物 | 2 | +------+--------+----------+
該方法的優(yōu)點(diǎn)是,它可以非常高效地查詢樹狀結(jié)構(gòu)數(shù)據(jù),并且可以很容易地?cái)U(kuò)展到查詢更多層級(jí)的層級(jí)。
? 版權(quán)聲明
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載。
THE END