如何干净地做一个带有标题和小标题的列表?

时间:2016-07-18 19:27:26

标签: php mysql database list mysqli

我正在尝试使用数据库制作带标题的列表。例如,我希望列表看起来像这样:

Programming
- Learn PHP
   - Make a blog using PHP
- Learn Swift - Learn Ruby

如您所见,主标题为Programming,然后是列表内容本身。我希望能够进行嵌套列表,如Learn PHP部分以及常用列表所示。对不起,如果这令人困惑。

我的PHP代码在这里工作:

<?php

$db = new mysqli('localhost', 'root', '', 'joshuapriestley');

$data = $db->query("SELECT * FROM goals");

while($row = $data->fetch_assoc()) {
    if($row["parent_id"] == 0) {
        echo "<ul>";
        echo "<li id=\"list-title\">" . $row["message"] . "</li>";

        $sub = $db->query("SELECT * FROM goals WHERE parent_id = " . $row["id"] . " AND sub_parent_id = 0");
        while($sub_row = $sub->fetch_assoc()) {
            echo "<li>" . $sub_row["message"];

            $sub2 = $db->query("SELECT * FROM goals WHERE sub_parent_id = " . $sub_row["id"]);
            if($sub2->num_rows != 0) {
                echo "<ul>";
                while($sub2_row = $sub2->fetch_assoc()) {
                    echo "<li>" . $sub2_row["message"] . "</li>";
                }
                echo "</ul>";
            }

            echo "</li>";
        }
        echo "</ul>";
    }
}               
?>

但对我来说,3 while循环似乎非常低效。有一个更好的方法吗?我有一个数据库:

Database

parent_id适用于常规项目,sub_parent_id适用于子项目。

这是显示结果的另一张图片: Result

1 个答案:

答案 0 :(得分:0)

while循环不是问题本身(性能明智)。这是三个查询。但首先要注意一些注意事项:

  1. 这是嵌套集。类似的问题:数据库中的树存储,菜单导航,分层数据表示。有大量的数据库布局和算法来查询和输出它们,这更适合提供单一查询解决方案并且工作得非常好。我强烈建议您阅读嵌套集模型。

  2. 您的数据库布局包含谎言:条目6的父级是5而不是2.或者您的列命名令人困惑。

  3. 因此,在您尝试第n次重新发明轮子之前,请使用众多解决方案中的一种。搜索引擎关键词:嵌套集(模型)。每个解决方案都有利弊,如果您有兴趣,有些页面会详细介绍......

    是的,我也被烧了。最接近你的解决方案存储节点的整个路径(包括节点本身!,在解决方案中缺少,id列不足以满足要求),然后可以循环遍历按路径排序的列表并确定打开并通过查看路径组件(公共前缀长度=深度)来关闭<ul/ol>。几乎除了检索之外的所有操作都很痛苦。