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

相关文章
相关标签/搜索