MySQL技巧(二)——無限級分類表設計


無限級分類表的設計(掌握'自身連接')

類似圖書這種,會有很多種分類,而且在現實生活中這種分類會無限的往下分,所以不可能每有一個分類就創建一個分類表。應該使用下面這種語句

  

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;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM