While循环中的While循环和输出php?

While循环中的While循环和输出php?,php,mysql,loops,while-loop,Php,Mysql,Loops,While Loop,我有一个while循环来显示我网站上帖子的回复 查询中使用的parentID值为$post['postID'],这是正在查看的帖子的详细信息数组 如下图所示,它输出以下内容(每个主题都是查看全文的链接) $q=$dbc->prepare(“从parentID=?”的BoardPost中选择*”; $q->execute(数组($post['postID']); 而($postReply=$q->fetch(PDO::fetch_ASSOC)){ 回声“”; } 目前,它输出的内容大致如下: 回

我有一个while循环来显示我网站上帖子的回复

查询中使用的parentID值为$post['postID'],这是正在查看的帖子的详细信息数组

如下图所示,它输出以下内容(每个主题都是查看全文的链接)

$q=$dbc->prepare(“从parentID=?”的BoardPost中选择*”;
$q->execute(数组($post['postID']);
而($postReply=$q->fetch(PDO::fetch_ASSOC)){
回声“”;
}
目前,它输出的内容大致如下:

回复此邮件:

主题1
主题2
主题3
科目4

有没有一种方法可以让我在列表中包括对回复的回复,类似于

回复此邮件:

主题1
主题1回复
主题1回复
主题1回复
主题2
主题3
主题3回复
主题3回复
主题3回复
主题4
主题4回复
主题5
主题6
主题6回复
主题4回复

我知道css可以实现所有缩进,但我一直在思考如何从mysql数据库中提取数据,并且按照正确的顺序,我尝试了while循环中的while循环,但这涉及while循环中的查询,这很糟糕


谢谢你的意见

我想您需要做的是重新设计数据库,将线程/主题关系存储在一个字段中,这样您就可以在一个查询中提取所有线程,然后在php中以编程方式对它们进行排序。如果您有一个parent_id字段,并且每个回复行都知道它的父项是谁以及它的顺序是什么(大概顺序是simply id>previous id),那么根据需要组织它们就非常简单了

然后,您可以遍历响应列表,并将所有项目放入JSON(y)对象中,该对象以正确的顺序/关系包含所有嵌套响应

为了减少不必要的膨胀,您可能还需要存储顶级父ID,以便您可以轻松地仅提取属于特定顶级线程的线程。通过这种方式,您可以轻松地只获取属于最后20个顶级线程的线程(从而减少没有人需要的古代线程上不必要的计算,并构建某种分页)

编辑。。。一些伪代码

select*from row order by top_level_id desc limit 0,20
//这将提供最多20个顶级线程,因此您不会提取整个数据库。最后的0应该是从PHP传入的页面变量,因此可以对第2页执行20,20,对第3页执行40,20

现在您可以这样做(显然这是伪代码,但您应该能够基于此模型完成它

$sortedRows; //this will be a JSON object, or hash array

for($row in result){
   addToThreadObj($row);
}

function addToThreadObj($row){
    if( containsParent($row.parent_id))
         addChildToParent($row.parent_id, $row);
    else
         createNewParent($row);
}

是的,我对每篇文章都有一个parentID,但是我不知道从哪里开始组织它们。这种方法对于大的结果集来说是失败的。(例如,你基本上在每页呈现时都会占用整个表)如果您需要在SQL数据库上建立稳定、高性能的层次结构,唯一的实际选择是嵌套集模型。@Billy ONeal,不,最后一段清楚地说明了如何避免处理整个数据库。请重新阅读。@Novac,我没有写很多PHP,因此,我不确定执行该操作的语法是什么,但您想要的是可视化将项目对象作为XML节点,将整个树作为XML DOM(只是为了比较)。当您提取一行时,您将创建一个节点,然后查看当前文档,查看是否已经有一个节点的id是此新节点的父id,如果有,则将其作为子节点添加到该节点,如果没有,则必须是父节点。只需确保按主键id从最小到最大的顺序循环,因为子节点将始终具有la@Dr.Dredel:当你试图显示一个单一的、大的主题时,这种方法会失败。不管你如何分割它,使用邻接列表模型,你最终会得到一棵N层深的树,你需要N个数据库查询(或N个连接)为了枚举。您的示例将用于显示简单的主题列表,但如果在实际用例中出现问题。
$sortedRows; //this will be a JSON object, or hash array

for($row in result){
   addToThreadObj($row);
}

function addToThreadObj($row){
    if( containsParent($row.parent_id))
         addChildToParent($row.parent_id, $row);
    else
         createNewParent($row);
}