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

问题描述

| 我只是想从角度看这个程序,因此我试图创建一个迷你公告。 这是我的桌子:
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\',\'[email protected]\',\'Welcome\',\'Welcome to the bulletin   board\',NULL);
insert into postings values  
        (\'2\',\'12/01/03 08:00\',\'[email protected]\',\'Welcome 2\',\'This is posting 2\',\'1\');
insert into postings values  
        (\'3\',\'13/01/03 09:00\',\'[email protected]\',\'Welcome 3\',\'This is posting 3\',\'1\');
insert into postings values  
        (\'4\',\'14/01/03 10:15\',\'New Topic\',\'This is posting 4\',NULL);
insert into postings values  
        (\'5\',\'15/01/03 10:15\',\'New Topic 2\',\'This is posting 5\',\'4\');
insert into postings values  
        (\'6\',\'16/01/03 10:15\',\'New Topic 3\',\'This is posting 6\',\'4\');
insert into postings values  
        (\'7\',\'17/01/03 10:15\',\'Welcome 4\',\'This is posting 7\',\'2\');
insert into postings values  
        (\'8\',\'18/01/03 10:15\',\'[email protected]\',\'Welcome 5\',\'This is posting 8\',\'2\');
insert into postings values  
        (\'9\',\'19/01/03 10:15\',\'Welcome 6\',\'This is posting 9\',\'8\');
insert into postings values  
        (\'10\',\'20/01/03 10:15\',\'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 \的帖子中选择*”等,请执行一个查询\“从Postings \中选择* *”,这会带回所有内容一个二维数组,其父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);
    ,嗯,我无法编辑ejrowley的答案(我是StackOverflow的新手),所以我发布了带有递归的整理和工作示例:
<?php

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

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

$posts = array();
$q = mysql_query(\"SELECT * FROM postings;\");
while ($row = mysql_fetch_assoc($q)) {
    $parentId = $row[\'ParentPost\'];
    $posts[$parentId ? $parentId : 0][] = $row; // because you use NULL and array can\'t have NULL key                                        
}

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

displayPosts(0,$posts); // where 0 means \'no parent\'                                                                                        

?>