php - 使用递归 PHP 组织 mySQL 数据

标签 php mysql recursion if-statement adjacency-list

我正在为客户创建一份调查问卷,要求将问题按 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/

相关文章:

php - SQL IN 语句和排序结果

php - 从 Mysql 中检索日期倒置

mysql - sql Select 和 order By 详解

mysql - 使用 Mysql 和 Hibernate 时表情符号的字符集编码问题

mysql - "error in your SQL syntax check the manual corresponds"一页消息

python - 更好地等效于这个疯狂的嵌套 python for 循环

c - C中的递归仅在打印不相关的东西时有效

php - CSV 大文件分割以导入 phpMyAdmin

java - 递归中的局部变量保留值?

php - Opencart 1.5.2 在一个下拉列表中显示类别