在 MySQL 中,id 和 pid 是兩個(gè)非常重要的字段,用于表達(dá)父子關(guān)系,尤其在樹形結(jié)構(gòu)數(shù)據(jù)操作中使用頻率極高。
id 字段是表中每條記錄的唯一標(biāo)識(shí),通常為自增長的整數(shù)值。在樹形結(jié)構(gòu)數(shù)據(jù)中,表示每個(gè)節(jié)點(diǎn)的編號(hào)。
CREATE TABLE `tree` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) NOT NULL DEFAULT '', `pid` int(11) NOT NULL DEFAULT '0', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
pid 字段表示該節(jié)點(diǎn)的父節(jié)點(diǎn)編號(hào),即當(dāng)前節(jié)點(diǎn)從屬于哪一個(gè)父節(jié)點(diǎn)。以此來構(gòu)建樹形結(jié)構(gòu)。如果節(jié)點(diǎn)為根節(jié)點(diǎn),則 pid 等于 0。
下面是 MySQL 中根據(jù) id 和 pid 構(gòu)建樹形結(jié)構(gòu) SQL 的示例:
WITH RECURSIVE cte (id, name, pid, depth, path) AS ( SELECT id, name, pid, 1, CAST(id AS CHAR(200)) FROM tree WHERE pid = 0 UNION ALL SELECT t.id, t.name, t.pid, c.depth + 1, CONCAT(c.path, ',', t.id) FROM tree t JOIN cte c ON t.pid = c.id ) SELECT id, name, pid, depth, path FROM cte ORDER BY path;
上面的 SQL 語句使用了 MySQL 中的 CTE 遞歸查詢功能,可以快速地生成樹形結(jié)構(gòu)。