Mysql查询从2个表中获取数据并在主类别下显示子类别

时间:2014-04-23 07:10:54

标签: php mysql sql

我在从mysql数据库中检索子类时遇到一些问题。我想显示父类别的子类别

父类别存储在Menu表中的ITEM表和子类别中。

Menu表格包含menu_idMenu_namerestaurant_id

Item表格包含item_iditem_namemenu_id列(menu_id的FK引用menu

   $sqlmenu = "SELECT * FROM item t1 LEFT JOIN menu t2 ON t1.menu_id = t2.menu_id WHERE t2.restaurant_id = ?"; 
   $datamenu = DB::prepare($sqlmenu)->execute([$restaurant_id])->fetchAll();

    <?php foreach($datamenu as $rowmenu){ ?>
                    <ul>
                        <li><?php echo $rowmenu['menu_name']; ?></li>
                            <ul>
                                <li>
                                    <?php echo $rowmenu['item_name']; ?>
                                </li>
                            </ul>
                    </ul>
                    <?php } ?>

使用上面的代码,我得到像

这样的输出
    Main Category1
     -- Sub category1


    Main Category1
     -- Sub category2


    Main Category2
     -- Sub category1


    Main Category2
     -- Sub category2

请帮帮我。我知道我在for循环中也包括主类别,但我想用一个查询来做,而不是多个查询。

3 个答案:

答案 0 :(得分:3)

实现此目的的一种方法是使用menu_name在查询组中使用group_concat(),然后在循环中展开并生成菜单

$sqlmenu = "SELECT 
t2.menu_id,t2.menu_name,group_concat(t1.item_name) as items
FROM item t1 LEFT JOIN menu t2 ON t1.menu_id = t2.menu_id 
WHERE t2.restaurant_id = ?
group by t2.menu_name"; 
$datamenu = DB::prepare($sqlmenu)->execute([$restaurant_id])->fetchAll();

foreach($datamenu as $rowmenu){ 
        <ul>
                <li><?php echo $rowmenu['menu_name']; ?></li>
                    <?php 
                        $items = $rowmenu['items'] ;
                        $items_array = explode(',',$items);
                        if(is_array($items_array) && count($items_array) > 0 ){
                        ?>
                            <ul>
                                <?php
                                    foreach($items_array as $item_name){
                                ?>
                                    <li>
                                        <?php echo $item_name; ?>
                                    </li>
                                <?php } ?>
                            </ul>
                            <?php }?>
        </ul>
<?php } ?>

答案 1 :(得分:0)

不使用2个查询,您可以通过菜单名称进行排序,然后检查您是否有新的查询。

 $sqlmenu = "SELECT * FROM 
             item t1 LEFT JOIN menu t2 
             ON t1.menu_id = t2.menu_id 
              WHERE  t2.restaurant_id = ? 
              ORDER BY t2.Menu_name"; 
   $datamenu = DB::prepare($sqlmenu)->execute([$restaurant_id])->fetchAll();
   $lastMenu = '';?>
                <ul>
    <?php foreach($datamenu as $rowmenu): ?>
                <?php  if($lastMenu != $rowmenu['menu_name']):
                             if($lastMenu != ''):?>
                       </ul>
                    </li>
                           <?php  endif; ?>
                    <li><?php echo $rowmenu['menu_name']; ?>
                        <ul>
                 <?php endif; ?>
                            <li>
                                <?php echo $rowmenu['item_name']; ?>
                            </li>
                 <?php  
                   $lastMenu = $rowmenu['menu_name'];
                endforeach; ?>
                 </ul>

我更喜欢另一个答案,但我只是想发布这个,因为我开始告诉你我在评论中的意思。

答案 2 :(得分:0)

这不是很漂亮,但我认为这个(未经测试的)代码会做你喜欢的事情。原理是在每次迭代数据时,检查主菜单中是否有变化。但是,这假定列表由主菜单排序。

另一种策略涉及迭代数据并构建多维数组。

MySQL每个查询只返回两个维度,因此您无法单独在SQL中执行所需的操作。

<?php /* do the SQL  */ ?>

<ul><!-- start unordered list of main menus -->
<?php 
    $currentmenu = "";
    $first = true;
    foreach($datamenu as $rowmenu) { 
      if ($currentmenu != $rowmenu['menu_id']) { //if new main menu
          if ($!first) {
                echo '</ul>'; //end previous sub menu list
          } else {
                $first = false;
          }
          echo '<li>'.$rowmenu['menu_name'].'</li><ul>'; //start new sub menu list
          $currentmenu = $rowmenu['menu_id']; //remember current menu
      }
?>
      <li>
          <?php echo $rowmenu['item_name']; ?>
      </li>
<?php 
    }
?>
    </ul> <!-- end last unordered list of sub menus -->
</ul> <!-- end unordered list of main menus -->