Mysql嵌套集合模型【省份城市示例】

父分類包圍了其子分類。在數據表中,咱們經過使用表示節點的嵌套關係的左值(left value)和右值(right value)來表現嵌套集合模型 中數據的分層特性。咱們使用了lft和rgt來代替left和right,是由於在MySQL中left和right是保留字。 http://dev.mysql.com/doc/mysql/en/reserved-words.html,有一份詳細的MySQL保留字清單。html

那麼,咱們怎樣決定左值和右值呢?咱們從外層節點的最左側開始,從左到右編號:node

複製代碼
CREATE TABLE `region` ( `id` int ( 11 ) NOT NULL auto_increment, `name` varchar ( 30 ) default NULL , `parent_id` int ( 11 ) default NULL , `lft` int ( 10 ) unsigned default NULL , `rgt` int ( 10 ) unsigned default NULL , PRIMARY KEY (`id`) ) ENGINE = InnoDB AUTO_INCREMENT = 11 DEFAULT CHARSET = utf8;
insert into `region`(`id`,`name`,`parent_id`,`lft`,`rgt`) values ( 1 , ' 中國 ' , 0 , 1 , 20 ); insert into `region`(`id`,`name`,`parent_id`,`lft`,`rgt`) values ( 2 , ' 北京 ' , 1 , 2 , 5 ); insert into `region`(`id`,`name`,`parent_id`,`lft`,`rgt`) values ( 3 , ' 北京市 ' , 2 , 3 , 4 ); insert into `region`(`id`,`name`,`parent_id`,`lft`,`rgt`) values ( 4 , ' 上海 ' , 1 , 6 , 9 ); insert into `region`(`id`,`name`,`parent_id`,`lft`,`rgt`) values ( 5 , ' 上海市 ' , 4 , 7 , 8 ); insert into `region`(`id`,`name`,`parent_id`,`lft`,`rgt`) values ( 6 , ' 浙江 ' , 1 , 10 , 19 ); insert into `region`(`id`,`name`,`parent_id`,`lft`,`rgt`) values ( 7 , ' 金華市 ' , 6 , 15 , 16 ); insert into `region`(`id`,`name`,`parent_id`,`lft`,`rgt`) values ( 8 , ' 溫州市 ' , 6 , 17 , 18 ); insert into `region`(`id`,`name`,`parent_id`,`lft`,`rgt`) values ( 9 , ' 杭州市 ' , 6 , 11 , 12 ); insert into `region`(`id`,`name`,`parent_id`,`lft`,`rgt`) values ( 10 , ' 寧波市 ' , 6 , 13 , 14 );
複製代碼

查詢所有節點分紅展現:mysql

SELECT CONCAT(REPEAT( ' ' , COUNT (parent.id) - 1 ), node.name) AS name, node.id,node.lft,node.rgt, COUNT (parent.id) FROM region AS node, region AS parent where node.lft BETWEEN parent.lft AND parent.rgt group by node.id ORDER BY node.lft;

查詢節點路徑:sql

select parent.name, parent.id from region as node, region as parent where node.lft BETWEEN parent.lft and parent.rgt and node.name = ' 金華市 ' ;

參考this

http://dev.mysql.com/tech-resources/articles/hierarchical-data.htmlspa

相關文章
相關標籤/搜索