首页 | 新闻 | 交流 | 问吧 | 文档 | 手册 | 下载 | 博客

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

作者:  时间: 2011-05-01

父分类包围了其子分类。在数据表中,我们通过使用表示节点的嵌套关系的左值(left value)和右值(right value)来表现嵌套集合模型
中数据的分层特性。我们使用了lft和rgt来代替left和right,是因为在MySQL中left和right是保留字。
http://dev.mysql.com/doc/mysql/en/reserved-words.html,有一份详细的MySQL保留字
清单。

那么,我们怎样决定左值和右值呢?我们从外层节点的最左侧开始,从左到右编号:

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),(2,'北京',1,2,5),(3,'北京市',2,3,4),(4,'上海',1,6,9),(5,'上海市',4,7,8),(6,'浙江',1,10,19),(7,'金华',6,15,16),(8,'温州',6,17,18),(9,'杭州',6,11,12),(10,'宁波',6,13,14);

查询全部节点分成展示:

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;

查询节点路径:

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

参考

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

作者: DWZ富客户端-jUI 发表于 2011-05-01 22:45 原文链接

评论: 0 查看评论 发表评论


最新新闻:
· LBS的未来:我们还能期待什么?(2011-05-01 20:46)
· 索尼称本周将部分恢复PlayStation网络服务(2011-05-01 18:33)
· 从 2006 到 2011,Twitter 的用户增长速度有多快?活跃的又有多少?(2011-05-01 18:13)
· 互联网受追捧难掩泡沫 VC/PE关注战略性新兴产业(2011-05-01 17:15)
· 中国企业家:人人爱电商(2011-05-01 16:17)

编辑推荐:为什么软件工程师的薪水和生产力如此不成比例

网站导航:博客园首页  我的园子  新闻  闪存  小组  博问  知识库