【问题标题】:Query inside query loop with both query outputs required在查询循环内查询,需要两个查询输出
【发布时间】:2015-08-25 12:54:17
【问题描述】:

在我的网站上,我想制作一个类似this 的导航栏,其中包含类别(此处为 2012 年)和文章(此处为 5 月至 10 月)。我有一个包含所有类别(infocat_id、名称)和一个包含所有文章(标题、正文、类别、infopost_id)的 MySQL 数据库。

我认为我可以将我的 php 编码如下:

<ul>
   <?php
    $query1 = $db->prepare("SELECT infocat_id, name FROM info_category");
    $query1->execute();
    $query1->bind_result($infocat_id, $name);
    while($query1->fetch()):
   ?>
   <li>
      <?php echo $name; ?>
      <ul>
         <?php
          $query2 = $db->prepare("SELECT title, infopost_id FROM info_posts WHERE category = $infocat_id");
          $query2->execute();
          $query2->bind_result($title, $infopost_id);
          while($query2->fetch()):
         ?>
         <li><?php echo $title; ?></li>
         <?php endwhile; ?>
      </ul>
   </li>
   <?php endwhile; ?>
</ul>

遗憾的是,这不起作用,因为我只有第一个类别名称,并且在“致命错误:调用 [php 文件所在目录中的非对象上的成员函数 execute() ] 在 [$query2-&gt;execute();] 行上。

我认为我不能使用 JOIN,因为我还需要第一个查询的输出。

我对 PHP 不是超级有经验,所以如果有人能帮助我,将不胜感激。

【问题讨论】:

  • 您在寻找嵌套类别吗?
  • 您如何获得在第二个查询中使用的$infocat_id

标签: php mysql navigation


【解决方案1】:

你可以使用join,只检查key的变化来决定是否再次输出title。

粗鲁地敲了起来,没有经过测试,但是是这样的:-

<ul>
   <?php
   $prev_infocat_id = 0;
    $query1 = $db->prepare("SELECT infocat_id, name, title, infopost_id
                FROM info_category
                LEFT OUTER JOIN info_posts
                ON info_category.infocat_id = info_posts.category");
    $query1->execute();
    $query1->bind_result($infocat_id, $name, $title, $infopost_id);
    while($query1->fetch())
    {
        if ($prev_infocat_id == 0)
        {
            echo '<li>';
        }
        else
        {
            if ($prev_infocat_id != $infocat_id)
            {
                echo '</li><li>';
            }
        }
        $prev_infocat_id = $infocat_id;
        echo '<li>'.$title.'</li>';
    } 
    if ($prev_infocat_id != 0)
    {
        echo '</li>';
    }
   ?>
</ul>

【讨论】:

  • 您好,您的代码运行良好!它只列出了文章,而不是类别,但我自己已经解决了。非常感谢!
【解决方案2】:

使用连接获得所需的输出:

 SELECT cat.infocat_id, cat.name,post.title, post.infopost_id  

    FROM info_category cat

    left join 
    info_posts post on post.category=cat.infocat_id

注意:如果您只需要匹配条件的数据,请使用 INNER JOIN。

【讨论】:

    猜你喜欢
    • 2020-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-15
    • 1970-01-01
    • 2017-03-25
    相关资源
    最近更新 更多