Php 仅使用组名连接2个表和显示菜单

Php 仅使用组名连接2个表和显示菜单,php,mysql,Php,Mysql,我有两张桌子: group --id --name category --id --name --group_id 其结果如下所示: gid--gname--cid--cname 1 ---abc----1----def 1 ---abc----2----ggg 2 ---ccc----3----eee 2 ---ccc----4----fff 我想显示如下菜单: abc --def --ggg ccc --eee --fff 我不能像上面那样显示菜单,如果我使用那个查询,我可以,但这很难。 什

我有两张桌子:

group --id --name category --id --name --group_id 其结果如下所示:

gid--gname--cid--cname 1 ---abc----1----def 1 ---abc----2----ggg 2 ---ccc----3----eee 2 ---ccc----4----fff 我想显示如下菜单:

abc --def --ggg ccc --eee --fff 我不能像上面那样显示菜单,如果我使用那个查询,我可以,但这很难。
什么查询或方法可以帮助我做到这一点?非常感谢

基本上,您必须为每个组循环并打印属于该组的所有类别。 在php中,您可以执行以下操作:

while( $group = mysql_fetch_array( mysql_query("SELECT id, name FROM group") ) ){
    echo $group[1];
    while( $category = mysql_fetch_array( mysql_query("SELECT id, name from category where group_id =" . $group[0] ) ) ){
        echo $category[1];
    }
}

这是一个演示的问题,但在这种情况下,您可能会发现使用GROUP_CONCAT为每个组打包类别很方便

选择g.id gid、g.name gname、GROUP_CONCATCONCATc.id、“|”、c.name ORDER BY c.id类别 从'group`g加入c类 关于g.id=c.group\u id 按g.id、g.name分组 这是演示

然后在php中轻松分解categories列,同时迭代resultset

只是想让您了解使用PDO时php部件的外观

$db=newpdo'mysql:host=localhost;dbname=dbname','user','password'; $db->setAttributePDO::ATTR_ERRMODE,PDO::ERRMODE_异常; $db->setAttributePDO::ATTR\u EMULATE\u PREPARES,false; $sql=按c.id类别选择g.id gid、g.name gname、GROUP_concatconccatc.id、“|”、c.name顺序 从'group`g加入c类 关于g.id=c.group\u id 按g.id、g.name分组; $query=$db->prepare$sql; $query->execute; $rows=$query->fetchallPDO::FETCH_ASSOC; $query=null; $db=null; 回响 foreach$行作为$行{ echo.$row['gid'.-'.$row['gname']; $categories=分解“,”,$row['categories']; 回响 foreach$类别作为$类别{ 列出$cid,$cname=explode'|',$category; echo.$cid.'-'.$cname; } 回响 } 回响 输出:

1-abc1-def2-ggg2-ccc3-eee4-fff试试这个:

$arr = array(
array('gid'=>1, 'gname'=>'abc', 'cid'=>1, 'cname'=>'def'),
array('gid'=>1, 'gname'=>'abc', 'cid'=>2, 'cname'=>'ggg'),
array('gid'=>2, 'gname'=>'ccc', 'cid'=>3, 'cname'=>'eee'),
array('gid'=>2, 'gname'=>'ccc', 'cid'=>4, 'cname'=>'fff'),
);

$res = array();



    foreach($arr as $ar){
              if(empty($res[$ar['gid']])){
                 $res[$ar['gid']] = array(
                     'gid'=>$ar['gid'],
                     'gname'=>$ar['gname'],

                 );
              }              
                $res[$ar['gid']]['category'][] = array('cid'=>$ar['cid'],'cname'=>$ar['cname']);


      }
       print_r($res);
不要告诉人们使用mysql_*命令。它们已弃用,不应再使用。教人们使用mysqli_u*或PDOTry此代码唯一的答案在StackOverflow上价值很低,因为他们在教育/授权OP和未来研究人员方面做得很差。始终在代码片段中提供解释。编辑答案永远不会太迟。这样做可以为新用户树立更好的行为榜样,他们可能认为只发布代码答案是可以的。