Php 如何查询所有根行的所有子层次结构的所有明细行?

Php 如何查询所有根行的所有子层次结构的所有明细行?,php,mysql,sql,Php,Mysql,Sql,有两个表s:一个是主表,一个是详细表(外键)。在master表中有一个hierarchy结构:每个master行都有其parent层次结构(自外键)。也许表格的DML可以清楚地解释这一点: CREATE TABLE classe_menu ( class_menu_code int(10) NOT NULL auto_increment, class_menu_lib varcha

有两个
s:一个是
主表
,一个是
详细表
(外键)。在
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_菜单”是
主表
而“菜单”是
详细表
表;但是在主表“classe\u menu”中,还有一个由“classe\u menu parent”列实现的
层次结构
结构:“classe\u menu”行是
层次结构的
,如果其“classe\u menu parent”为

现在我想得到的是所有的'classe_menu'根目录行和所有'classe_menu'的'menu'行,也就是所有根目录'classe_menu'及其
子目录


如何做到这一点?

您只需要根目录(空类菜单父目录)类菜单记录,以及该记录的所有菜单行,以及该根目录项层次结构下的任何其他类菜单记录,对吗?您希望如何返回数据-因为这是一对多关系;您是否希望所有内容都包含在一个结果集中,左侧是classe_菜单列(重复),右侧是菜单列?还是在两个单独的查询中?您是传入一个参数(class\u menu\u code),还是希望它用于所有根记录?你能使用临时表和游标吗?或者这个查询会被频繁调用并且需要高效吗?对于你的第一个问题,答案是肯定的。对于第二个,我希望在PHP数组中返回数据:数组将有一个
class\u menu
列参数,比如class\u menu\u lib,和一个
menu
column参数,比如menu\titre,以及该记录的所有菜单行以及该根项层次结构下的任何其他classe_菜单记录,对吗?您希望如何返回数据-因为它是一对多关系;您是否希望所有内容都包含在一个结果集中,左侧是classe_菜单列(重复),右侧是菜单列?还是在两个单独的查询中?您是传入一个参数(class\u menu\u code),还是希望它用于所有根记录?你能使用临时表和游标吗?或者这个查询会被频繁调用并且需要高效吗?对于你的第一个问题,答案是肯定的。对于第二个,我希望在PHP数组中返回数据:数组将有一个
class\u menu
列参数,比如class\u menu\u lib,和一个
menu
column参数,比如menu\titre。他需要一些递归的东西来获取分层数据:啊,在问题中看不到任何表示输出需要递归的内容。在这种情况下,这将需要一些php代码,虽然相当简单,但我不想在手机上输入。如果没有人比我强,我会在开始工作后编辑我的答案。@SeanW>左右数据是手动输入的吗?如果对层次结构进行了更新,该怎么办:如何重新计算左右值?在一些PHP代码中编辑。希望这能起作用,但显然我不能在没有实际设置数据库和所有东西的情况下运行它,所以如果它出现任何错误,请告诉我。想法是有的,但似乎有一些更改要做!他需要一些递归的东西来获取分层数据:啊,在问题中看不到任何东西,说输出需要递归。在这种情况下,这将需要一些php代码,虽然相当简单,但我不想在手机上输入。如果没有人比我强,我会在开始工作后编辑我的答案。@SeanW>左右数据是手动输入的吗?如果对层次结构进行了更新,该怎么办:如何重新计算左右值?在一些PHP代码中编辑。希望这能起作用,但显然我不能在没有实际设置数据库和所有东西的情况下运行它,所以如果它出现任何错误,请告诉我。想法是有的,但似乎有一些更改要做!
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);