Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 基于三个表输出嵌套注释_Php_Database_Mysqli - Fatal编程技术网

Php 基于三个表输出嵌套注释

Php 基于三个表输出嵌套注释,php,database,mysqli,Php,Database,Mysqli,我有三个表,1.注释,2.嵌套注释,3。用户名 我目前正在努力以最佳方式输出嵌套注释 $sql = "SELECT comment.*, nested_comment.subject AS nc_subject, users.username FROM comment INNER JOIN users ON comment.user_id = users.id AND comment.blog_id = $id LEFT JOIN nested_comment

我有三个表,1.注释,2.嵌套注释,3。用户名 我目前正在努力以最佳方式输出嵌套注释

$sql = "SELECT comment.*, nested_comment.subject AS nc_subject, users.username
    FROM comment
    INNER JOIN users
      ON comment.user_id = users.id AND comment.blog_id = $id
    LEFT JOIN nested_comment
      ON comment.id = nested_comment.comment_id
    ORDER BY comment.id DESC";
我的当前视图代码

<? while($comment = $result->fetch_object()) { ?>

<p> <?=$comment->subject . ' by ' . $comment->username; ?> </p>

<hr>
<div class="nested_comment">
  <p> <?=$comment->nc_subject; ?> </p>
</div>


我想要的所有数据都显示出来了,但是假设我有-2个嵌套注释-在-1个父注释中-父注释仍然显示了2次,而不是仅显示了一次


我可以在while循环中使用if-else语句进行检查,如果前面的注释id相同,但我正在为此寻找更优雅/有效的解决方案,我不确定如何在sql上对其进行“分组”,因为您在同一查询中检索注释和嵌套注释的所有列,结果的每一行都将包含注释,并且多次包含嵌套注释

将查询拆分为两个单独的查询以分别获取注释和嵌套注释,或者,如您所说,放置一个
if
子句以检查当前
comment.id
是否与上一个相同

使用
if
,执行以下操作:

<? curr_id = -1;
   while($comment = $result->fetch_object()) {
       if $comment->id != curr_id {
               curr_id = $comment->id ?>
           <p> <?=$comment->subject . ' by ' . $comment->username; ?> </p>
       <? } ?>
       <hr>
       <div class="nested_comment">
         <p> <?=$comment->nc_subject; ?> </p>
       </div>



更优雅的方法是,您可以使用父注释作为数组的键,使用嵌套注释作为值,将这些注释提取到数组中

$array[ $comment->subject ][] = $comment->nc_subject;
然后,您可以使用“foreach”迭代这个数组,并构建div

foreach( $array as $key => $value )
$key将是您的父注释,$value将是包含嵌套注释的数组。因此,为了得到嵌套注释,您还需要迭代$value


您可以查看这个答案,了解键值数组的用法:

谢谢您的回复,嗯。。对于1个查询,这是不可能的吗?可能有类似于从sql查询中使用相同的-注释父id-对所有列进行分组的情况,可能..即使按分组,也会得到分组列。顺便说一句,在你的
orderby
子句中,添加
nested\u comment.id
。我在查询中不是“groupby”,而是“grouping it”,我相信你知道我的意思。是的,还是有争议哪条路最好,谢谢!好的选择。我以前确实这样做过,但一旦我们每个页面有10k行结果,将所有结果存储在数组中似乎是个坏主意,因为必须在任何输出之前先构建数组。请注意,
comment->id
将是一个比
comment->subject
更好的键,因为主题在不同的评论中可以是相同的。感谢这个解决方案,有趣的主题,这是在更大的卷量上做这件事的最佳方式,是更快地拆分为两个查询?@aneroid是的,你是对的,我完全没有抓住主题的重点。我认为最好将它们用作键,因为他会打印出来。此外,如果数组创建为
$array[$comment->id][]=array('nc_subject'=>$comment->nc_subject,'nc_subject\'id'=>$comment->nc_subjectid)
等,并将行关联数组作为值,然后,他可以将
嵌套的\u注释的所有必需数据作为可检索的值,供以后使用。