MySQL 是一種流行的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng)。它具有許多功能,其中之一是父子關(guān)系表查詢。父子關(guān)系表在數(shù)據(jù)庫(kù)設(shè)計(jì)中很常見,因?yàn)樗鼈兛梢杂糜跇?gòu)建層次結(jié)構(gòu)。
CREATE TABLE `category` ( `id` int(11) NOT NULL AUTO_INCREMENT, `parent_id` int(11) DEFAULT NULL, `name` varchar(255) NOT NULL, PRIMARY KEY (`id`), KEY `parent_id` (`parent_id`), CONSTRAINT `category_ibfk_1` FOREIGN KEY (`parent_id`) REFERENCES `category` (`id`) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO `category` (`id`, `parent_id`, `name`) VALUES (1, NULL, '手機(jī)'), (2, 1, '智能手機(jī)'), (3, 1, '老人手機(jī)'), (4, 2, '華為手機(jī)'), (5, 2, '小米手機(jī)'), (6, 2, '蘋果手機(jī)');
在這個(gè)示例中,我們建立了一個(gè)叫做 "category" 的表,它包含三個(gè)列: "id", "parent_id" 和 "name"。
"id" 列用于標(biāo)識(shí)每個(gè)分類的唯一性。
"parent_id" 列用于表示該分類的父級(jí)分類。如果該分類是根分類,則該列的值為 NULL。
"name" 列用于存儲(chǔ)分類名稱。
下面是一個(gè)查詢語句,它能夠返回所有分類以及它們的子分類:
SELECT c1.name AS level1, c2.name AS level2, c3.name AS level3 FROM category AS c1 LEFT JOIN category AS c2 ON c2.parent_id = c1.id LEFT JOIN category AS c3 ON c3.parent_id = c2.id WHERE c1.parent_id IS NULL;
這個(gè)查詢使用LEFT JOIN
來連接 "category" 表三次,每個(gè)連接都連接到同一個(gè)表,但是使用不同的表別名。
第一次連接將 "c1" 表連接到 "category" 表,用于獲取根級(jí)分類 "level1"。
第二次連接將 "c2" 表連接到 "category" 表,用于獲取 "level2" 的子類別,這些子類別的父級(jí)分類被設(shè)置為 "level1" 的 "id"。
第三次連接將 "c3" 表連接到 "category" 表,用于獲取 "level3" 的子類別,這些子類別的父級(jí)分類被設(shè)置為 "level2" 的 "id"。
最后,查詢使用WHERE
子句限制了只返回根級(jí)別分類。我們通過檢查 "c1.parent_id" 是否為 NULL 來判斷這點(diǎn)。