Database 板


LINE

不管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







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:BuyTogether站內搜尋

TOP