Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/272.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/8/mysql/55.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
在mysql/php中处理父/子类别_Php_Mysql_Categories - Fatal编程技术网

在mysql/php中处理父/子类别

在mysql/php中处理父/子类别,php,mysql,categories,Php,Mysql,Categories,我有以下mysql表类别: 我想得到这个结果: 要获得此结果,我使用以下代码,但速度非常慢: foreach($db->query("SELECT * FROM categories WHERE parent IS NULL") as $parent) { $t=0; categories($db,$t,$parent['id'],$parent['category']); } function categories($db,$t,$id,$category) {

我有以下mysql表类别:

我想得到这个结果:

要获得此结果,我使用以下代码,但速度非常慢:

foreach($db->query("SELECT * FROM categories WHERE parent IS NULL") as $parent)
{
    $t=0;
    categories($db,$t,$parent['id'],$parent['category']);
}

function categories($db,$t,$id,$category)
{
    echo"<option value=".$id.">";//
    for($i=0;$i<$t;$i++) {echo"&nbsp;&nbsp;&nbsp;"; $GLOBALS['cat'].="&nbsp;&nbsp;&nbsp;";}
    echo $category."</option>";//" ".$id.
    $GLOBALS['cat'].=$category."<br>";
    $t++;
    if($db->query("SELECT * FROM categories WHERE parent=".$id)->rowCount()>0)
    {
        foreach($db->query("SELECT * FROM categories WHERE parent=".$id) as $child)
        categories($db,$t,$child['id'],$child['category']);
    }
}
您有更快的解决方案吗?
谢谢

如果您知道树的最大深度或所需深度,您可以将其全部放在SQL中,展平为表示路径的行:

SELECT c.category, c1.category AS sub1, c2.category AS sub2, c3.category AS sub3
FROM categories c
    LEFT JOIN 
        (categories c1 
             LEFT JOIN
                 (categories c2
                      LEFT JOIN categories c3 
                      ON c3.parent = c2.category)
                 ON c2.parent = c1.category)
         ON c1.parent = c.category
WHERE c.parent IS NULL;
因此,在UI中相应地显示它并不是什么大问题。

您应该看看嵌套集。然后你就可以避免为了建立你的树而不得不做很多查询。。。信息太多,无法在此处共享…可能重复
$sql = "SELECT id, name, parent_id,
    (SELECT COUNT(*) FROM categories WHERE parent_id = cat.id) as child_count
    FROM categories cat";

$result = db_select_all($sql);

function build_menu($pid, $level = 1) {
    global $result;
    $filtered = array_filter($result, function($elem) use($pid) {
        return $elem['parent_id'] == $pid;
    });

    if(empty($filtered)) return;

    foreach($filtered as $item) {
        extract($item);
        echo "<div>" . str_repeat("---", $level) .  $name;
        build_menu($id, $level + 1);
        echo "</div>" . PHP_EOL;
    }
}



$menu_elements = array_filter($result, function($item) {
    return $item['parent_id'] == '';
});


foreach($menu_elements as $menu) {
    $name = $menu['name'];
    $id = $menu['id'];
    echo "<div>" . $name;
    build_menu($id);
    echo "</div>" . PHP_EOL;
}
SELECT c.category, c1.category AS sub1, c2.category AS sub2, c3.category AS sub3
FROM categories c
    LEFT JOIN 
        (categories c1 
             LEFT JOIN
                 (categories c2
                      LEFT JOIN categories c3 
                      ON c3.parent = c2.category)
                 ON c2.parent = c1.category)
         ON c1.parent = c.category
WHERE c.parent IS NULL;
$sql = "SELECT id, name, parent_id,
    (SELECT COUNT(*) FROM categories WHERE parent_id = cat.id) as child_count
    FROM categories cat";

$result = db_select_all($sql);

function build_menu($pid, $level = 1) {
    global $result;
    $filtered = array_filter($result, function($elem) use($pid) {
        return $elem['parent_id'] == $pid;
    });

    if(empty($filtered)) return;

    foreach($filtered as $item) {
        extract($item);
        echo "<div>" . str_repeat("---", $level) .  $name;
        build_menu($id, $level + 1);
        echo "</div>" . PHP_EOL;
    }
}



$menu_elements = array_filter($result, function($item) {
    return $item['parent_id'] == '';
});


foreach($menu_elements as $menu) {
    $name = $menu['name'];
    $id = $menu['id'];
    echo "<div>" . $name;
    build_menu($id);
    echo "</div>" . PHP_EOL;
}