Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 优化/简化多层类别查询_Php_Mysql - Fatal编程技术网

Php 优化/简化多层类别查询

Php 优化/简化多层类别查询,php,mysql,Php,Mysql,我有一个MySQL表(名称:item\u categories),具有以下模式: id INT(11) PRIMARY KEY, AUTO INCREMENT category_name VARCHAR(100) NOT NULL parent_id INT(11) NOT NULL, Default 0 样本数据: id category_name parent_id =

我有一个MySQL表(名称:
item\u categories
),具有以下模式:

id                  INT(11)           PRIMARY KEY, AUTO INCREMENT
category_name       VARCHAR(100)      NOT NULL
parent_id           INT(11)           NOT NULL, Default 0
样本数据:

id  category_name   parent_id
=============================
1   Fruit           0
2   Animal          0
3   Furniture       0
4   Apple           1
5   Orange          1
6   Cat             2
7   Dog             2
8   Black Dog       7
9   White Dog       7
如果我必须列出这些类别及其父类别,我必须在数据库表中循环多次

我的问题是:如何简化循环任务

当前循环任务查询:

// 1st query
$sql = "SELECT * FROM item_categories";
$rs = $db->query($sql);
while($row = $db->result($rs)) {
  if((int)$row['parent_id'] === 0) {
    // it is parent
    echo $row['category_name'] . PHP_EOL;
  } else {
    $category = $row['category_name'];

    // it has parent
    $sql = "SELECT * FROM item_categories WHERE id=" . $row['parent_id'];
    $rs2 = $db->query($sql);
    $row2 = $db->result($rs);
    $parent_id = (int)$row2['parent_id'];
    while($parent_id != 0) {
      $sql = "SELECT * FROM item_categories WHERE id=" . $row['parent_id'];
      $rs2 = $db->query($sql);
      $row2 = $db->result($rs);
      $parent_id = (int)$row2['parent_id'];
      $category = $row2['category_name'] . ' > ' . $category;
    }
    echo $category;
  }
}
这将输出:

Fruit
Animal
Furniture
Fruit > Apple
Fruit > Orange
Animal > Cat
Animal > Dog
Animal > Dog > Black Dog
Animal > Dog > White Dog

根据我在评论中给你的链接,尝试以下方法:

function renderBreadcrumbs($db, $id, $path = null) {
    $res = $db->query("SELECT id, parent_id, category_name FROM item_categories WHERE id = " . $id);
    $row = $db->result($res);

    $path = $row['category_name'] . ' > ' . $path;

    if($row['parent_id'])
        $path = renderBreadcrumbs($db, $row['parent_id'], $path);

    return $path;
}

$res = $db->query("SELECT id, parent_id, category_name FROM item_categories ORDER BY parent_id ASC");

while($row = $db->result($res)) {
    $breadcrumb = null;

    if(!$row['parent_id'])
        $breadcrumb .= $row['category_name'];
    else
        $breadcrumb .= renderBreadcrumbs($db, $row['parent_id'], $row['category_name']);

    echo $breadcrumb . PHP_EOL;
}

查看本主题中标记为正确的答案:。基本上,你只需要一次完整的列表(一个查询),格式化它,然后使用递归来构建树。智能回答只需要一个SQL调用。如果你根据我给你的链接编写了代码,请告诉我-如果没有,我将试着用一些代码示例发布答案来帮助你。这个答案很好,但是如果你想通过回答这个问题来获得一些学分,请这样做:)代码没有按预期列出输出。可能是由于与您引用的答案结构不同。好的,我将在这里创建相同的表,并检查问题所在,几分钟后将更新answear。我认为
array\u walk()
array\u walk\u recursive()
可能会有所帮助。我已经编辑了我的答案-假设您的
$db->result(),它现在应该可以工作了
方法返回关联数组。如果它已经返回数值1,只需将
数组值($row)
更改为简单的
$row
。哦,是的,对不起-因为它基于列表结构,而不是面包屑1。。。无论如何-答案经过编辑、更正和简化。