+ -
当前位置:首页 → 问答吧 → 能有更好的查詢方式

能有更好的查詢方式

时间:2010-09-08

来源:互联网

我建立两个资料表作为分类用的资料表

程式码: sql
create table dirname(
dirname_id int,
name varchar(200),
PRIMARY KEY (dirname_id)
);
create table dir (
dir_id int,
parent_dir int,
child_dir int,
PRIMARY KEY (dir_id,parent_dir,child_dir)
);
insert into dirname (dirname_id ,name) values(0,'最上层1');
insert into dirname (dirname_id ,name) values(1,'最上层2');
insert into dirname (dirname_id ,name) values(2,'子目录1');
insert into dirname (dirname_id ,name) values(3,'子目录2');
insert into dirname (dirname_id ,name) values(4,'子目录3');
insert into dir (dir_id ,parent_dir,child_dir) values(0,0,2);
insert into dir (dir_id ,parent_dir,child_dir) values(0,0,3);
insert into dir (dir_id ,parent_dir,child_dir) values(0,0,4);
insert into dir (dir_id ,parent_dir,child_dir) values(0,1,3);
insert into dir (dir_id ,parent_dir,child_dir) values(0,1,4);

我希望能够查询出来关联到父目录和子目录的栏位,可是我这样写好像等於查询了3个表...
程式码: sql
select A1.name as parent, dirname.name as child from dir,dirname,dirname A1
where dir.child_dir=dirname.dirname_id AND A1.dirname_id=dir.parent_dir;

作者: ah11851152n   发布时间: 2010-09-08

你是希望子目录有很多父目录吗?不然不应该用这样n:m的关系来设计。

如果只是一个简单的树,那只要一个资料表就可以做出来:
程式码:
create table `directory` (
`id` int not null auto_increment,
`parent` int,
`dirname` varchar (255) not null,
primary key (id),
key(parent)
);

作者: fillano   发布时间: 2010-09-09

看一下这一篇
http://webweb.cz.cc/show_article.php?aId=3154

作者: micmic3   发布时间: 2010-09-09

或许你会比较需要
Nested tree model
可以在一个select的动作中把所有的子树或是父节点给找出来

http://www.cnblogs.com/wllyy189/archive/2009/08/17/1547877.html




以上图为例子

要找出Fruit的所有子层
select * from tree where left > 2 and right <11;

要找出Cherry的所有父层
select * from tree where left < 4 order by left desc;

参考看看吧

作者: ricky   发布时间: 2010-09-09

不过用邻接表来表示树,维护的代价比较高。

作者: fillano   发布时间: 2010-09-09

引用自: fillano 於 2010-09-09 10:38
不过用邻接表来表示树,维护的代价比较高。

这个树状结构主要是应用在经常读取,却不常修改节点的情况下。
每修改一次节点就得重建整棵树
目前Propel,cakephp已经内建这种树状结构的支援了。

作者: ricky   发布时间: 2010-09-09