Re: [問題] 關於變動數量的資料要放進Access
不管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
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):