Php 基于三个表输出嵌套注释
我有三个表,1.注释,2.嵌套注释,3。用户名 我目前正在努力以最佳方式输出嵌套注释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
$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注释的所有必需数据作为可检索的值,供以后使用。