有两个table
:一个是master
,一个是detail
(外键)。在master
表中有一个hierarchy
结构:每个master
行都有parent
层次结构(自我外键)。也许表中的DML可以清楚地解释它:
CREATE TABLE classe_menu (
class_menu_code int(10) NOT NULL auto_increment,
class_menu_lib varchar(50) default NULL,
class_menu_comment text,
class_menu_deleted tinyint(1) default '0',
class_menu_ordre int(11) default NULL,
class_menu_parent int(10) default NULL,
PRIMARY KEY (class_menu_code) ,
KEY association_108_fk (class_menu_parent),
CONSTRAINT fk_association_108 FOREIGN KEY (class_menu_parent) REFERENCES classe_menu (class_menu_code)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
CREATE TABLE menu (
menu_code int(10) NOT NULL auto_increment,
class_menu_code int(10) default NULL,
menu_lib varchar(100) default NULL,
menu_url varchar(255) default NULL,
menu_titre varchar(100) default NULL,
menu_parent decimal(10,0) default NULL,
menu_visible tinyint(1) default NULL,
menu_ordre decimal(2,0) default NULL,
menu_action varchar(50) default NULL,
menu_icone_img varchar(255) default NULL,
menu_icone_flag tinyint(1) default '0',
menu_icone_title varchar(50) default NULL,
menu_deleted tinyint(1) default '0',
menu_tooltip varchar(25) default NULL,
menu_trace text,
menu_image varchar(255) default NULL,
menu_contextuel tinyint(1) default '0',
menu_logo varchar(255) default NULL,
menu_display int(1) default '0',
PRIMARY KEY (menu_code),
KEY association_109_fk (class_menu_code),
CONSTRAINT fk_association_109 FOREIGN KEY (class_menu_code) REFERENCES classe_menu (class_menu_code)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COMMENT='liste des menus du site'
正如您所见,'classe_menu'是master
表,'menu'是detail
表;但是在主表'classe_menu'中,还有一个由{class_menu_parent'列实现的hierarchy
结构:如果'class_menu_parent',则'{classe_menu'行是root
的{{1}}行是hierarchy
。
现在我想要的是获取所有'classe_menu'的所有'classe_menu' root 行和'menu'行,即所有root'classe_menu'及其所有{{1} }}
怎么做?
答案 0 :(得分:1)
function getMenuChildren($code,$code_is_class_menu=false){
$children = array();
$sql = 'SELECT * FROM menu WHERE '.($code_is_class_menu?'class_menu_code':'menu_parent').' = '.$code;
$res = mysql_query($sql);
while ($row = mysql_fetch_assoc($res)){
$row['children'] = getMenuChildren($row['menu_code']);
$children[] = $row;
}
return $children;
}
$class_menus = array();
$sql = 'SELECT * FROM classe_menu WHERE class_menu_parent IS NULL';
$res = mysql_query($sql);
while ($row = mysql_fetch_assoc($res)){
$row['children'] = getMenuChildren($row['class_menu_code'],true);
$class_menus[] = $row;
}
print_r($class_menus);