我正在为客户创建一份调查问卷,要求将问题按 3 个层次组织。我已经成功创建了 U.I.但是,在过去的 3 个小时里,我一直在尝试以所有内容都加载到正确位置的方式从数据库中提取数据。数据库是由客户组织的,所以我无法控制它:
id description parentId about
1 Level 1 0 This is the top level or in my case tab1
2 Level 2 0 This is the next tab in the top level
3 Level 1a 1 This is the first category under tab1
4 Level 1b 1 This is the next category under tab1
5 Level 1a1 3 This is the content under the first category of tab1
因此,parentId 为 0 的任何内容都是顶级,并且将包含 parentId 为 1 的第二级别的任何内容,依此类推。令人困惑的是,我几乎无法理解这一点,但这就是我被告知要这样做的方式。
执行此类操作的最佳方法是什么?下面附上了我用作引用的另一个问题的示例(尽管不起作用)
foreach (mysql_query("SELECT * FROM pB_test ORDER BY id ASC") as $row) {
$menuitem = array_merge(array(), $row);
$menuLookup[$menuitem['id']] = $menuitem;
if ($menuitem['parent'] == null) {
$menuitem['path'] = "/" . $menuitem['name'];
$menu[] = $menuitem[];
} else {
$parent = $menuLookup[$menuitem['parent']];
$menuitem['path'] = $parent['path'] . "/" . $menuitem['name'];
$parent['menu'][] = $menuitem;
}
}
如有任何帮助,我们将不胜感激。干杯
最佳答案
如果你正好有 3 个级别,那么你可以试试这个:
http://sqlfiddle.com/#!2/70e96/16
(
SELECT 1 AS lvl,
top_level.description AS o1, top_level.id AS id1,
NULL AS o2, NULL AS id2,
NULL AS o3, NULL AS id3,
top_level.*
FROM node AS top_level
WHERE top_level.parentId = 0
)UNION ALL(
SELECT 2 AS lvl,
top_level.description AS o1, top_level.id AS id1,
category_level.description AS o2, category_level.id AS id2,
NULL AS o3, NULL AS id3,
category_level.*
FROM node AS top_level
INNER JOIN node AS category_level ON category_level.parentId = top_level.id
WHERE top_level.parentId = 0
)UNION ALL(
SELECT 3 AS lvl,
top_level.description AS o1, top_level.id AS id1,
category_level.description AS o2, category_level.id AS id2,
last_level.description AS o3, last_level.id AS id3,
last_level.*
FROM node AS top_level
INNER JOIN node AS category_level ON category_level.parentId = top_level.id
INNER JOIN node AS last_level ON last_level.parentId = category_level.id
WHERE top_level.parentId = 0
)
ORDER BY o1,o2,o3;
我在选择中添加了一个 lvl
字段,每个级别都有不同的值。还添加了 o1、o2、o3 以很好地排序嵌套级别,当然您可能有其他需求。您可以在 PHP 中处理所有行,例如将它们分成 3 个数组(每个级别一个),或者通过 id 等创建一个查找表。
关于php - 使用递归 PHP 组织 mySQL 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10992200/