作者bobju (宝贝猪)
看板Database
标题Re: [问题] 关於变动数量的资料要放进Access
时间Sun Apr 12 10:46:01 2009
不管10人或几百几千人, 增设一个parent_id的栏位就行了.
ex:
Create Table: CREATE TABLE `members` (
`id` int(11) NOT NULL,
`parent_id` int(11) default NULL,
`name` varchar(5) default NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
insert into members values(1,0,'A');
insert into members values(2,1,'B');
insert into members values(3,1,'C');
insert into members values(4,2,'D');
insert into members values(5,3,'E');
他们的关系:
A<-+-B<-+-D
|
+-C<-+-E
资料库定义好後, 接着就是写程式码进行读取.
以下的程式码已用php5测试过, 可以正确运作. 若有疑问, 欢迎讨论,
若无疑问, 欢迎自行改成符合自己需要的.
<?
class members{
//1.捞出指定目标:
function read($name){
$link=$this->db_conn();
$sql="
select m.*
from members as m
where m.name='$name';
";
$rs=mysql_query($sql,$link);
$r=mysql_fetch_assoc($rs);
return $r;
}
//2.当要捞出某人其父节点资料时:
function read_parent($name){
$link=$this->db_conn();
$sql="
select mp.*
from members as m
left join members as mp on m.parent_id=mp.id
where m.name='$name';
";
$rs=mysql_query($sql,$link);
$r=mysql_fetch_assoc($rs);
return $r;
}
//3.当要捞出某人的所有直属子节点(只有第一层, 不含第二层以下)资料时:
function read_childs($name){
$link=$this->db_conn();
$sql="
select mch.*
from members as mch
left join members as m on m.id=mch.parent_id
where m.name='$name';
";
$list=array();
$rs=mysql_query($sql,$link);
while($r=mysql_fetch_assoc($rs)){
$list[]=$r;
}
return $list;
}
//4.当要捞某人的所有子孙时, 需要用递回程式控制:
function &cascade_list($name){ //注意本函式会传回一个array的reference
//1.捞出自己
$me=$this->read($name);
//2.捞出childs
$childs = $this->read_childs($name);
//3.对於每一个child, 捞出其childs
foreach($childs as &$child){ //注意$child前的'&': 用reference存取$child
$me['childs'][] = $this->cascade_list($child['name']);
}
return $me;
}
//资料库连线
function &db_conn(){
$link=mysql_connect('localhost','login','passwd'); //帐密自订
mysql_select_db('mm');
return $link;
}
}//end of class members
//捞出来後, 可用print_r函式或var_dump函式观看其结构. 进一步就看如
//何应用.
//测试跑出来的结果是否符合预期:
$m=new members;
print_r($m->cascade_list('A'));
?>
ex:
其结构是:
Array
(
[id] => 1
[parent_id] => 0
[name] => A
[childs] => Array
(
[0] => Array
(
[id] => 2
[parent_id] => 1
[name] => B
[childs] => Array
(
[0] => Array
(
[id] => 4
[parent_id] => 2
[name] => D
)
)
)
[1] => Array
(
[id] => 3
[parent_id] => 1
[name] => C
[childs] => Array
(
[0] => Array
(
[id] => 5
[parent_id] => 3
[name] => E
)
)
)
)
)
※ 引述《IamCoolKing (我是冷王!!!)》之铭言:
: 大家好, 我问一个笨问题 (我是用Access)
: 假如有两个table, member table 跟 member dependents table
: member table 有一个或多个栏位是要储存跟此会员相关的人物
: 也就是说 跟会员A 有关系的人有 A1~A10 这十个人
: 那我在设计栏位时, 要用 十个栏位来表示 A1~A10 吗?
: 或者有更好的设计方式? (有类似阵列的方式吗?
: 万一有关系的人有超过10个人的话, 要怎麽做比较恰当呢?
: 谢谢回答 ^^"
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 59.104.186.206