MySQL技巧(二)——無限級分類表設計
阿新 • • 發佈:2018-11-10
無限級分類表的設計(掌握'自身連線')
類似圖書這種,會有很多種分類,而且在現實生活中這種分類會無限的往下分,所以不可能每有一個分類就建立一個分類表。應該使用下面這種語句
DROP TABLE IF EXISTS tdb_goods_types;
CREATE TABLE tdb_goods_types(
type_id SMALLINT PRIMARY KEY AUTO_INCREMENT COMMENT '分類ID',
type_name VARCHAR(50) COMMENT ' 分類名稱',
parent_id SMALLINT NOT NULL DEFAULT 0 COMMENT '父類ID'
);
然後再模擬圖書類的分類來個小demo
INSERT INTO tdb_goods_types(type_name,parent_id) VALUES('電子書',DEFAULT);
INSERT INTO tdb_goods_types(type_name,parent_id) VALUES('文學',1);
INSERT INTO tdb_goods_types(type_name,parent_id) VALUES ('影視原著',2);
INSERT INTO tdb_goods_types(type_name,parent_id) VALUES('中外名著',2);
INSERT INTO tdb_goods_types(type_name,parent_id) VALUES('漫畫雜誌',2);
INSERT INTO tdb_goods_types(type_name,parent_id) VALUES('文學',2);
INSERT INTO tdb_goods_types(type_name,parent_id) VALUES('小說',2);
INSERT INTO tdb_goods_types(type_name,parent_id) VALUES ('傳記',2);
INSERT INTO tdb_goods_types(type_name,parent_id) VALUES('經管',1);
INSERT INTO tdb_goods_types(type_name,parent_id) VALUES('金融投資',9);
INSERT INTO tdb_goods_types(type_name,parent_id) VALUES('市場營銷',9);
INSERT INTO tdb_goods_types(type_name,parent_id) VALUES('管理學',9);
INSERT INTO tdb_goods_types(type_name,parent_id) VALUES('職場進階',9);
INSERT INTO tdb_goods_types(type_name,parent_id) VALUES('科學新知',1);
INSERT INTO tdb_goods_types(type_name,parent_id) VALUES('人工智慧',14);
INSERT INTO tdb_goods_types(type_name,parent_id) VALUES('電子商務',14);
INSERT INTO tdb_goods_types(type_name,parent_id) VALUES('大資料',14);
INSERT INTO tdb_goods_types(type_name,parent_id) VALUES('科普',14);
從下圖中很容易可以看到,'電子書'為頂級分類,所以parent_id為0,以此類推....
這時候我們需要查詢具體分類以及對應父類,我們就需要假想有兩張相同的表,一張是父表(parent),一張是子表(son),自己連線自己查詢,子表的parent_id = 父表的type_id,子表中的type_name就是子類分類,父表中的type_name就是父類分類名稱
SELECT
s.type_id AS 分類編號,
s.type_name AS 分類名稱,
p.type_name AS 父類名稱
FROM
tdb_goods_types AS s
LEFT JOIN tdb_goods_types AS p ON s.parent_id = p.type_id;
也可以用另一種思路,檢視父類,以及對應的子類
SELECT
p.type_id AS 分類編號,
p.type_name AS 父類名稱,
s.type_name AS 子類名稱
FROM
tdb_goods_types AS p
LEFT JOIN tdb_goods_types AS s ON s.parent_id = p.type_id;
改進:獲取的是子類的數量
SELECT
p.type_id AS 分類編號,
p.type_name AS 父類名稱,
COUNT(s.type_name) AS 子類數目
FROM
tdb_goods_types AS p
LEFT JOIN tdb_goods_types AS s ON s.parent_id = p.type_id
GROUP BY
p.type_name
ORDER BY
p.type_id ASC;