1. 程式人生 > >MySQL技巧(二)——無限級分類表設計

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;