無限級分類表設計(三十七)

2021-09-08 12:31:26 字數 3621 閱讀 3006

實際上我們在開發過程中,就拿商品類別來說,它還可以有更多的延伸,我們先來舉乙個簡單的例子,比如圖書,他的下面還可以分**、文學等,在**下面還可以分為言情**、科幻**等,還可以再往下一級一級繼續分,那麼這種分類就屬於無限極分類,那麼無限極分類錶該如何去設計,理論上說我們可以設計很多張表,但是隨著分類的逐步增多,表的數目就會越來越多,所以無限極分類表往往採用另外一種形式。

我們先來看一下它的語法結構。

create

table

tdb_goods_types(

type_id

smallint unsigned primary

keyauto_increment,

type_name

varchar(20) not

null

,parent_id

smallint unsigned not

null

default

0);

這種資料表至少存在3個字段,第乙個是分類的id,第二個欄位是分類的名稱,第三個欄位是他父類的id,也就是說他實際上是通過自身的連線來實現的。

現在我們就先建立這張表,操作命令及結果如下:

create

table

tdb_goods_types(

type_id

smallint unsigned primary

keyauto_increment,

type_name

varchar(20) not

null

, parent_id

smallint unsigned not

null

default

0);

現在我們插入幾條我們事先準備好的資料,命令如下:

insert tdb_goods_types(type_name,parent_id) values('

家用電器

',default

);

insert tdb_goods_types(type_name,parent_id) values('

電腦、辦公

',default

);

insert tdb_goods_types(type_name,parent_id) values('

大家電',1

);

insert tdb_goods_types(type_name,parent_id) values('

生活電器

',1);

insert tdb_goods_types(type_name,parent_id) values('

平板電視

',3);

insert tdb_goods_types(type_name,parent_id) values('

空調',3

);

insert tdb_goods_types(type_name,parent_id) values('

電風扇',4

);

insert tdb_goods_types(type_name,parent_id) values('

飲水機',4

);

insert tdb_goods_types(type_name,parent_id) values('

電腦整機

',2);

insert tdb_goods_types(type_name,parent_id) values('

電腦配件

',2);

insert tdb_goods_types(type_name,parent_id) values('

筆記本',9

);

insert tdb_goods_types(type_name,parent_id) values('

超級本',9

);

insert tdb_goods_types(type_name,parent_id) values('

遊戲本',9

);

insert tdb_goods_types(type_name,parent_id) values('

cpu',10

);

insert tdb_goods_types(type_name,parent_id) values('

主機',10);

ok,插入成功之後。

下面我們來檢視一下裡邊的記錄,我們輸入select * from  tdb_goods_types;

那麼後面的數字表示什麼意思呢?

比如這個家用電器的0就表示他沒有父親節點,為頂級分類,再比如大家電後面的1就表示它的父親節點是id號為1的家用電器

這就是無限極分類的資料表,但是這裡邊就涉及到另外乙個問題,我們該怎麼做查詢。

要做查詢的話,我們就需要通過自身連線來實現,所謂自身連線,就是指資料表自己來連線自己,下面我們來做乙個簡單的演示,我們還以剛才那個表為例,比如我要查詢所有子類的父類,比如家用電器他的父類是什麼?如果沒有就是null,那麼這就需要大家有一點想象力,就是在這張表的右側還有一張跟他結構完全一樣的資料表。假設我們把左邊的當成父表,右邊的當成子表,那麼我們左邊的父表中的parent_id這個欄位就沒有什麼用了。

下面我們來看看該怎麼寫,這裡邊就一定要起別名了,因為所有的字段都是相同的,我們就把子表取為s,父表取為p,具體操作命令及結果如下:

ok,這樣我們就查到了子類所對應的父類的名字。沒有父類的就為null.當然這裡我們只能查到他的一級父類,mysql暫時還沒有遞迴查詢的能力,後面我們可以通過程式來實現。  

下面我們再來查詢一下子類的父類,以及父類下面的子類,這裡只是參照的表不同而已,比如這次我們把左邊的當子表,右邊的當父表,操作命令及結果如下:

那麼現在如果我想要父類下面子類的數目。那麼該怎麼辦呢?我們只需要做一下簡單的修改,對父類做一下分組,對子類數目做一下統計就行。

ok,這就沒有重複的了,但是他的順序有點亂,那麼下面就對他排一下序。修改後的命令及結果如下:

現在我們想要子類的數目而不是子類的名字,那麼我們只需要做乙個計數就行,我們簡單修改一下。修改後的命令及結果如下:

ok,這就是我們想要的。這也就是通過自身連線來實現的。

mysql無限級分類表設計

create table tdb goods types type id smallint unsigned primary key auto increment,type name varchar 20 not null,parent id smallint unsigned not null d...

無限級分類

相信在實際專案中很多人在做專案的時候都會用到無限級分類,無限級分類說白了就是乙個遞迴,遞迴在我們的專案開發中起到很重要的作用,如 麵包屑導航等。下面我們演示乙個遞迴的案例 area array array id 1,name 安徽 parent 0 array id 2,name 海淀 parent...

無限級分類

無限極分類其實就是乙個遞迴便利 1,查詢所有資料 namespace home controller use think controller class indexcontroller extends controller 2,遞迴便利資料 namespace home model use thi...