MYSQL無限級分類表設計及自我串連

來源:互聯網
上載者:User

標籤:sql   昆明   為什麼   weight   城市   join   logs   arch   聯動   

我們有這樣一個需求:

做一個城市聯動,比如說貴州省,省下面有眾多市,市下面有眾多區縣,區縣下面有眾多鎮,如果用多張表來儲存,必然是能夠簡單的實現聯動效果,但是多表的聯集查詢必然會影響到一些效率,此時可以考慮

用一張表來實現。

還有當我們要分的級數是不確定的,或者是很多的,那麼建立多張表也是不合理的設計。

如何用一張表來儲存呢?

該表的建立代碼如下:

 1 create table city(id smallint unsigned auto_increment primary key, 2 city_name varchar(20) not null ,parent_id smallint unsigned not null); 3  4 insert into city(city_name,parent_id) values("貴州",0); 5 insert into city(city_name,parent_id) values("貴陽",1); 6 insert into city(city_name,parent_id) values("遵義",1); 7 insert into city(city_name,parent_id) values("銅仁",1); 8 insert into city(city_name,parent_id) values("雲南",0); 9 insert into city(city_name,parent_id) values("昆明",4);10 insert into city(city_name,parent_id) values("麗江",5);11 insert into city(city_name,parent_id) values("四川",0);12 insert into city(city_name,parent_id) values("成都",8);13 insert into city(city_name,parent_id) values("浙江",0);14 insert into city(city_name,parent_id) values("寧波",10);15 insert into city(city_name,parent_id) values("河南",0);16 insert into city(city_name,parent_id) values("鄭州",12);17 insert into city(city_name,parent_id) values("開封",12);18 insert into city(city_name,parent_id) values("安陽",12);

我用了三個欄位,其中parent_id儲存的是父級的id,相當於是一個指標,指向父級。比如貴州,id為1,其中有貴陽,遵義,銅仁的parent_id為1,表示的含義為貴州省下有這三個城市。

為什麼要有parent_id來指向父節點呢?我們來看看下面這張表。

就這張表而言,你能看出什麼來?能看出成都是四川下的一個 市嗎?所以parent_id欄位是必不可少的。

整張表是一個森林的資料結構,那麼我們怎麼查詢到一個省下有多少個城市呢?

select p.id,p.city_name,s.city_name from city as p left join city as s on p.id=s.parent_id;

結果如下:

其中

select p.id,p.city_name,s.city_name表示查詢出來的表只顯示著三個欄位,p代表父表,s代表子表。那麼明明只有一張表,從何而來父表與子表呢?這就是所謂的自身串連。

你可以在腦海中想像另外一張表,該表和city表一模一樣,然後像操作兩張表一樣將他們通過條件串連起來,此時我的條件就是p.id=s.parent_id;
left join表示左串連,意思就是父表的資料全部顯示,子表的資料如果不存在則顯示為空白,比如上面顯示的,鄭州,我們通過p.id=s.parent_id沒有查詢到父表的id與子表的parent_id相同,於是父表的資料(13,鄭州)

完全顯示出來,子表的資料顯示為空白。

MYSQL無限級分類表設計及自我串連

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.