没有嵌套查询的Php程序,使其成为有用的代码

时间:2016-01-25 02:10:22

标签: php html mysql pdo

有没有人知道如何使用一个查询而不是嵌套查询来创建此过程。基本上我正在尝试在下拉菜单中的主类别中获取子类别。我一直在讨论它很长时间,但是现在我只是使用这个嵌套循环因为我无法想出另一种方式。 谢谢!

    <ul role=menu>
    <?php 
        $statement = $database->prepare("SELECT * FROM category");
        $statement->execute();
        while($category = $statement->fetch(PDO::FETCH_ASSOC))
        {
    ?>
       <li><a href='<?php echo '/'.urlencode($category['name']);?>.html'><?php echo $category['name']; ?></a>
          <ul>
          <?php 
            $stmt = $database->prepare("SELECT * FROM area WHERE belong_to_category = :category_name");
            $stmt->execute(array(':category_name' => $category['name']));
            while($sub_category = $stmt->fetch(PDO::FETCH_ASSOC))
            {
          ?>
             <li role="menuitem"><a href='<?php echo '/'.urlencode($sub_category['name']);?>.html'><?php echo $sub_category['name'];?></a>
          <?php 
            }
          ?>        
          </ul>
       </li>
    <?php 
        }
    ?>      
    </ul>

1 个答案:

答案 0 :(得分:1)

您可以在查询语句中结合使用简单的JOIN来使用此处所述的PDO fetch PDO::FETCH_GROUP

反过来,您将获得类别作为键,然后相应的值是子类别。

您尚未发布任何数据库架构,因此我只举一个通过密钥加入它们的示例。

基本理念:

SELECT
    T1.[role],
    Value = coalesce(max(nullif(T2.value,'DEFAULT')),'DEFAULT')
FROM
    @temp T1
    JOIN @temp2 T2 ON COALESCE(T2.[role], T1.[role]) = T1.[role]
group by
    T1.[role]
;

编辑。另一种方法是手动构建阵列。仍然使用相同的查询语句但不使用$sql = ' SELECT category.name AS category_name, area.name AS area_name FROM category JOIN area ON area.category_id = category.id '; // just a simple join $statement = $database->prepare($sql); $data = $statement->fetchAll(PDO::FETCH_GROUP | PDO::FETCH_ASSOC); // use the `PDO::FETCH_GROUP` flag // this turns the fetched data into a grouped one // ul foreach($data as $category => $sub_categories) { // li echo $category; // category name // ol foreach($sub_categories as $s) { // li echo $s['area_name']; // the area name // close li } // close ol // li close } // ul close // Just fetch the necessary depth, this is just an idea

沿着这些方向:

PDO::FETCH_GROUP