MySQL之无限级分类表设计
首先查找一下goods_cates表和table_goods_brands數(shù)據(jù)表
分別使用命令:
root@localhost test>show columns from goods_cates; root@localhost test>select * from goods_cates;1、無限分級表設(shè)計(jì)
但這僅僅是示例,遠(yuǎn)遠(yuǎn)達(dá)不到實(shí)際的需求,比如說書籍這個(gè)類,在網(wǎng)站上可以搜索到在書籍這個(gè)分類下面還有歷史,文學(xué),經(jīng)濟(jì)等等子類,子類下面還有子類,這種無限分類如何設(shè)計(jì)呢?理論上可以設(shè)計(jì)很多張表,隨著分類的增多,這些數(shù)據(jù)表不可能無限擴(kuò)展,因此可以通過如下設(shè)計(jì):
CREATE TABLE table_goods_type(type_id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT, type_name VARCHAR(20) NOT NULL, parent_id SMALLINT UNSIGNED NOT NULL DEFAULT 0 );創(chuàng)建成功之后查看一下
root@localhost test>show columns from table_goods_type;現(xiàn)在插入若干條記錄
INSERT table_goods_type(type_name,parent_id) VALUES ('家用電器',DEFAULT); INSERT table_goods_type(type_name,parent_id) VALUES ('電腦辦公',DEFAULT); INSERT table_goods_type(type_name,parent_id) VALUES ('大家電',1); INSERT table_goods_type(type_name,parent_id) VALUES ('生活電器',1); INSERT table_goods_type(type_name,parent_id) VALUES ('平板電視',3); INSERT table_goods_type(type_name,parent_id) VALUES ('空調(diào)',3); INSERT table_goods_type(type_name,parent_id) VALUES ('電風(fēng)扇',4); INSERT table_goods_type(type_name,parent_id) VALUES ('飲水機(jī)',4); INSERT table_goods_type(type_name,parent_id) VALUES ('電腦整機(jī)',2); INSERT table_goods_type(type_name,parent_id) VALUES ('電腦配件',2); INSERT table_goods_type(type_name,parent_id) VALUES ('筆記本',9); INSERT table_goods_type(type_name,parent_id) VALUES ('超極本',9); INSERT table_goods_type(type_name,parent_id) VALUES ('游戲本',9); INSERT table_goods_type(type_name,parent_id) VALUES ('CPU',10); INSERT table_goods_type(type_name,parent_id) VALUES ('主機(jī)',10);?查詢一下記錄 root@localhost test>select * from table_goods_type;關(guān)于parent_id的說明:
1、parent_id為0,家用電器為頂級結(jié)點(diǎn),意味著就是沒有父親結(jié)點(diǎn),因此就是為0,同電腦辦公也是父親節(jié)點(diǎn)
2、大家電作為家用電器的子類,所以其父類為家用電器的type_id,所以寫的是1,同生活電器
3、而平板電視屬于大家電的子類,因此其parent_id為3,同樣飲水機(jī)屬于生活電器,因此parent_id為4,依次類推
上述的表設(shè)計(jì)好了之后如何做查找呢?
要做查找的話就需要通過自身連接來實(shí)現(xiàn),所謂自身連接就是數(shù)據(jù)連接并不是其他數(shù)據(jù)表,而是自身。
現(xiàn)在想查找所有的子類和其父類,如何操作呢?要是有兩張表,可以很容易知道,但是現(xiàn)在一張表怎么實(shí)現(xiàn)呢,想象右側(cè)也有一張表,這張表示子表
? ? ? ? ? ? ?
因?yàn)樽颖碇械膒arent_id指向的是父表中的type_id
root@localhost test> SELECT son.type_id,son.type_name,parent.type_name FROM table_goods_type AS son-> LEFT JOIN table_goods_type AS parent-> ON son.parent_id = parent.type_id;因?yàn)榧译婋娖骱碗娔X辦公屬于頂級分類,因此其沒有父類,其它的均可以查找到父類,因?yàn)镸ySQL沒有遞歸查詢的能力,因此只能查找到一級分類。既然能查到子類的id(type_id),子類的名字name(type_name)和父類的名字type_name.?
root@localhost test>SELECT parent.type_id,parent.type_name,son.type_name FROM table_goods_type parent LEFT JOIN-> table_goods_type son ON son.parent_id = parent.type_id;這樣就查到了左邊和右邊兩個(gè)類,左邊是家用電器這個(gè)類,其子類有大家電和生活電器,大家電下面有子類平板電視和空調(diào),依次類推,當(dāng)然像主機(jī)、CPU下面就沒有子類,所以為NULL。由于左邊的父類顯示有重復(fù)的,這里進(jìn)行修改
root@localhost test>SELECT parent.type_id,parent.type_name,son.type_name FROM table_goods_type parent LEFT JOIN-> table_goods_type son ON son.parent_id = parent.type_id GROUP BY parent.type_name; root@localhost test>SELECT parent.type_id,parent.type_name,son.type_name FROM table_goods_type parent LEFT JOIN-> table_goods_type son ON son.parent_id = parent.type_id GROUP BY parent.type_name-> ORDER BY parent.type_id;現(xiàn)在只顯示子類的數(shù)目,不顯示子類的名字
root@localhost test>SELECT parent.type_id,parent.type_name,count(son.type_name) child_count FROM table_goods_type parent LEFT JOIN-> table_goods_type son ON son.parent_id = parent.type_id GROUP BY parent.type_name-> ORDER BY parent.type_id;這樣就只顯示了子類的數(shù)量
2、多表的刪除
多表的刪除的語法結(jié)構(gòu)是
DELETE table_name[.*] [,table_name[.*]]... FROM table_references [WHERE where_condition]在表goods中發(fā)現(xiàn)有兩條重復(fù)的記錄,分別是honorX6和Laserjet Pro P16重復(fù),可能在有意無意鍵錄入了重復(fù)的記錄,現(xiàn)在想刪除重復(fù)的記錄,保留goods_id較小的那個(gè),這就是通過多表刪除實(shí)現(xiàn),采用一張表模擬兩張表的方法實(shí)現(xiàn),首先要查找重復(fù)的記錄。
root@localhost test>SELECT goods_id,goods_name FROM goods GROUP BY goods_name;總共11條記錄,現(xiàn)在分組篩選之后還有9條,說明重復(fù)了2條,但是只想要記錄重復(fù)(超過兩個(gè)以上的),因此可以是HAVING
root@localhost test>SELECT goods_id,goods_name FROM goods GROUP BY goods_name HAVING count(goods_name) >= 2;這兩條記錄就是重復(fù)的,就是需要?jiǎng)h除的,因此可以參照這張表刪除初始的表goods????
root@localhost test>DELETE t1 FROM goods AS t1 LEFT JOIN (SELECT goods_id,goods_name FROM goods GROUP BY-> goods_name HAVING count(goods_name) >= 2) AS t2 ON t1.goods_name = t2.goods_name WHERE t1.goods_id > t2.goods_id;提示兩條記錄被刪除,再來查看一下表goods
總結(jié)
以上是生活随笔為你收集整理的MySQL之无限级分类表设计的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySQL之连接
- 下一篇: MySQL之运算符和函数