我创建了一个管理区域,它使用 php 从 mysql 数据库中提取数据并将结果显示在表格中。基本上它显示一个父类别,然后是它下面的第一个子类别,然后是第三级子类别/主题。
它工作得很好,但由于我是 mysql 和 php 的新手,我确信代码需要改进以节省数据库资源,因为在构建表时我使用 3 个 while 循环,并且在每个循环中进行一个 mysql 查询,我是肯定是错误的方法。
有人可以为我提供一些帮助,以最好的方式做到这一点吗?
这是代码:
$query = mysql_query("SELECT * FROM categories WHERE
parent_id is null
order by cat_id asc;", $hd)
or die ("Unable to run query");
while ($row = mysql_fetch_assoc($query)) {
echo '<tr style="font-weight:bold;color:green;"><td>'. $row ['cat_id'].'</td><td>'.$row['cat_name'].'</td><td>'.$row ['parent_id'].'</td><td>'.$row['active'].'</td><td>'.$row ['url'].'</td><td>'.$row['date_updated'].'</td></tr>' ;
$query2 = mysql_query("SELECT * FROM categories WHERE
(active = 'true' AND parent_id = ".$row ['cat_id'].")
order by cat_id asc;", $hd)
or die ("Unable to run query");
while ($row2 = mysql_fetch_assoc($query2)) {
echo '<tr style="font-weight:bold;"><td>'. $row2['cat_id'].'</td><td>'.$row2 ['cat_name'].'</td><td>'.$row2['parent_id'].'</td><td>'.$row2 ['active'].'</td><td>'.$row2['url'].'</td><td>'.$row2 ['date_updated'].'</td></tr>' ;
$query3 = mysql_query("SELECT * FROM categories WHERE
(active = 'true' AND parent_id = ".$row2 ['cat_id'].")
order by cat_id asc;", $hd)
or die ("Unable to run query");
while ($row3 = mysql_fetch_assoc($query3)) {
echo '<tr><td>'. $row3['cat_id'].'</td><td>'.$row3['cat_name'].'</td><td>'.$row3 ['parent_id'].'</td><td>'.$row3['active'].'</td><td>'.$row3 ['url'].'</td><td>'.$row3['date_updated'].'</td></tr>' ;
}
}
}
编辑
好的,所以我做了一些研究,这就是我所在的位置:
可能对于一个小型数据库,我的方法很好。
对于使用数组存储数据的更大数据库可能意味着我需要使用可能会占用太多内存的递归方法。很想听听人们的想法,它是否仍然比在嵌套的 while 循环中循环 db 查询更好?
我找到了以下线程,其中没有递归且只有一个查询的答案。不确定是否需要在当前设计中添加位置列: 如何通过 PHP 和 mysql 构建无限级别的菜单
如果我使用嵌套集模型而不是邻接模型重建设计,那么 mysql 查询将以所需的顺序返回结果,但是维护嵌套集设计超出了我的考虑范围,我认为这太过分了。
而已。如果有人对此有任何意见,请添加到对话中。必须有一种成功的方法,因为大量的 Web 应用程序必须需要这种要求。