0

我有 2 张桌子、评论和八卦。
Gossips 有 3 列:id、userid、gossip。
Comments 有 4 列:id、userid、gossipid、comment。
我编写了这段代码,以便程序回显所有八卦和特定于每个八卦的评论。

   $query = 'SELECT * FROM gossips ORDER BY id DESC LIMIT 0,10';
                            $result = mysqli_query($cxn, $query)
                                or die("Couldn't execute query");
                            while($row = mysqli_fetch_assoc($result))
                            {
                                    echo '<div class="gossip">'.$row['gossip'].'</div><form action="comment.php" method="post"><input type="hidden" name="gossipid" value="'.$row['id'].'" />';
                                    echo '<input type="text" name="comment" placeholder="Write your comment here"/><br /><input type="submit" value="Comment" /></form><br />';
                                        $querycomment = "SELECT * FROM comment WHERE gossipid ='{$row['id']}' ORDER BY id DESC";
                                        $resultcomment = mysqli_query($cxn, $query)
                                            or die("Couldn't fetch comments.");
                                        while($comments = mysqli_fetch_assoc($resultcomment))
                                        {
                                            echo $comments['comment'];
                                        }
                            }


这段代码的输出只是回应八卦,并没有执行第二个 while 循环。可能是什么问题呢 ?

4

1 回答 1

1

$resultcomment第一次绕过该循环时,您会遍历整个结果集。当外部 $result循环的第二次迭代开始时,没有更多的数据可以从第二个查询中获取,因此实际上内部循环只针对集合中的第一条记录运行$result

既然您似乎在使用外部循环的数据过滤内部循环的结果,为什么不将该内部查询基于相同的数据,这样您就不会在整个comment表中糟蹋并丢弃除匹配记录之外的所有内容?这是一种可怕的浪费。

更像的东西

SELECT * FROM gossips
while(fetch gossip) {
     SELECT * FROM comment WHERE id = gossip.id
}

这更有效,因为您只获取您实际想要显示的评论。进一步的优化是将两个查询重写为单个JOIN查询,并使用一些循环逻辑来检测您何时在八卦之间进行更改。

于 2013-08-21T20:25:40.730 回答