我有两张桌子,评论和八卦
Gossips有3列:id,userid,八卦
评论有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循环。可能是什么问题?
答案 0 :(得分:1)
第一次绕过该循环时,您将浏览整个$resultcomment
结果集。当外部$result
循环的第二次迭代启动时,没有更多数据要从第二个查询中获取,因此实际上内部循环仅从$result
集合中运行该FIRST记录。
由于您似乎使用外部循环的数据过滤内部循环的结果,为什么不将该内部查询基于相同的数据,因此您不会吮吸整个comment
表并抛弃所有内容除外对于匹配的记录?这是一种可怕的浪费。
更像是
SELECT * FROM gossips
while(fetch gossip) {
SELECT * FROM comment WHERE id = gossip.id
}
这样效率更高一些,因为您只获取实际想要显示的注释。进一步的优化是将两个查询重写为单个JOIN
查询,并使用一些循环逻辑来检测您何时在闲话之间进行更改。