【发布时间】:2012-11-29 19:31:55
【问题描述】:
可能重复:
Is it possible to query a tree structure table in MySQL in a single query, to any depth?
我创建了一个管理区域,它使用 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 查询更好?
我找到了以下线程,其中有一个答案可以在没有递归且只有一个查询的情况下执行此操作。不确定是否需要在当前设计中添加位置列: How to build unlimited level of menu through PHP and mysql
如果我使用嵌套集模型而不是邻接模型重建设计,那么 mysql 查询将按所需顺序返回结果,但是维护嵌套集设计超出了我的想象,我认为这太过分了。
就是这样。如果有人对此有任何意见,请添加到对话中。必须有一种成功的方法,因为大量的 Web 应用程序必须需要这种要求。
【问题讨论】:
标签: php mysql hierarchical-data nested-sets