如何使用PHP和MySQL从数据库中检索数据并缩进返回的结果?

如何使用PHP和MySQL从数据库中检索数据并缩进返回的结果?,php,mysql,sql,Php,Mysql,Sql,为了更好地理解这个节目,我正在尝试制作一个迷你公告 这是我的桌子: CREATE TABLE Postings ( `PostID` INT( 11 ) NOT NULL AUTO_INCREMENT , `PostDate` DATETIME NOT NULL , `PostedBy` VARCHAR( 255 ) NOT NULL , `PostSubject` VARCHAR( 255 ) NOT NULL , `Content` VARCHAR( 255 ) NOT NULL , `Pa

为了更好地理解这个节目,我正在尝试制作一个迷你公告

这是我的桌子:

CREATE TABLE Postings
(
`PostID` INT( 11 ) NOT NULL AUTO_INCREMENT ,
`PostDate` DATETIME NOT NULL ,
`PostedBy` VARCHAR( 255 ) NOT NULL ,
`PostSubject` VARCHAR( 255 ) NOT NULL ,
`Content` VARCHAR( 255 ) NOT NULL ,
`ParentPost` INT( 11 ) NULL ,
PRIMARY KEY (  `PostID` )
)
下面是该表中的数据:

insert into postings values  
        ('1','11/01/03 10:15','a@abc.com','Welcome','Welcome to the bulletin   board',NULL);
insert into postings values  
        ('2','12/01/03 08:00','b@abc.com','Welcome 2','This is posting 2','1');
insert into postings values  
        ('3','13/01/03 09:00','c@abc.com','Welcome 3','This is posting 3','1');
insert into postings values  
        ('4','14/01/03 10:15','a@abc.com','New Topic','This is posting 4',NULL);
insert into postings values  
        ('5','15/01/03 10:15','a@abc.com','New Topic 2','This is posting 5','4');
insert into postings values  
        ('6','16/01/03 10:15','a@abc.com','New Topic 3','This is posting 6','4');
insert into postings values  
        ('7','17/01/03 10:15','c@abc.com','Welcome 4','This is posting 7','2');
insert into postings values  
        ('8','18/01/03 10:15','d@abc.com','Welcome 5','This is posting 8','2');
insert into postings values  
        ('9','19/01/03 10:15','a@abc.com','Welcome 6','This is posting 9','8');
insert into postings values  
        ('10','20/01/03 10:15','b@abc.com','New Topic 4','This is posting 10','6');
PostID是自动递增的,并且是主键,ParentPost也是INT,并且将为其分配值

现在我要做的是编写一个SQL语句和PHP代码,允许我从数据库中检索所有值,但缩进每一行,其中ParentPost值等于PostID行下的PostID值

我在底部有一张图片,可以更好地解释我想要什么

这就是我到目前为止不走运的想法:

<?php

$db_host = "localhost";
$db_username = "root";
$db_pass = "";
$db_name = "OnlineBulletinBoardDB";

@mysql_connect("$db_host","$db_username","$db_pass") or die ("Could no connect to    MySQL");
@mysql_select_db("$db_name") or die ("No database");

$query="SELECT PostSubject FROM postings GROUP BY PostID = ParentPost;";

$result=mysql_query($query);

$num=mysql_numrows($result);

mysql_close();

?>

<?php
$i=0;
while ($i < $num) {
$dno=mysql_result($result,$i,"PostSubject");
?>

<?php echo $dno; ?><br/>

<?php
$i++;
}
?>


我寻找的最终结果如下图所示:


大家好。

递归是关键。为了避免执行大量查询,如“从ParentID=0的帖子中选择*”、“从ParentID=1的帖子中选择*”等,请执行一个查询“从帖子中选择*”,该查询返回所有内容,然后使用父id填充二维数组,父id是第一个数组的键。下面的示例未经测试,但需要稍微整理一下:

<?php

$db_host = "localhost";
$db_username = "root";
$db_pass = "";
$db_name = "OnlineBulletinBoardDB";

@mysql_connect("$db_host","$db_username","$db_pass") or die ("Could no connect to    MySQL");
@mysql_select_db("$db_name") or die ("No database");

$query="SELECT PostSubject, PostID, ParentID FROM postings";

$res = mysql_query($query);


while($row = mysql_fetch_assoc($res){
    $parentID = intval($row['ParentID']);
    $posts[$parentID][] = $row;
}

function displayPosts($parentId, $posts){
    echo "<ul>";
    foreach($posts[$parentId] as $post){
       echo "<li>";
           echo $post['PostSubject'];
           if(isset($posts[$post['PostID']])){
               displayPosts($post['PostID'],$posts);
           }
       echo "</li>";
    }
    echo "</ul>";
}

displayPosts($posts['PostID'],$posts);
嗯,我不能编辑(我是StackOverflow新手),所以我发布了一个更整洁的递归工作示例:


什么不起作用/错误是什么?上面的代码只检索“欢迎”和“欢迎2”。但我需要以某种方式检索所有结果,并以上图所示的格式显示它们。如果您想获取所有条目(如@Jason所要求的),这可能是最好的方法。但请注意,这将很快降低数据库性能:)更高级:@Fge我理解您的观点,但瓶颈实际上变成了php-此代码只使用直接的SQL查询。我认为内存不足将是您遇到的第一个问题。@Xaerxess我没有注意到数据库中的NULL,我已经更新了代码,@Jason我建议您对ParentID使用not NULL默认值0,NULL需要额外的存储空间,处理起来可能会很麻烦