0

次のように、最大​​ 3 レベルの子カテゴリを含むカテゴリ ツリーがあります。

houseproducts->livingroom->sofas->twoseats

houseproducts->livingroom->sofas->threeseats

houseproducts->livingroom->sofas->fourseats

したがって、サブレベルごとに、母親のカテゴリ ID に基づいて SELECT を実行します。これは、以下のコードのように PHP ループで実行されますが、パフォーマンスを向上させるために、単一の Mysql クエリで実行できると思います。さまざまな JOINS を試しましたが、本当に難しいと思います。どんなアドバイスでも大歓迎です。

function build_category_tree() 
{
    $cat = array();

    // main category loop
    $r1 = mysql_query("SELECT cat_id,cat_name FROM categories WHERE cat_mother=0 OR cat_mother='' ORDER BY cat_name");  
    while ($row=mysql_fetch_assoc($r1)) 
    {
        $cat[$row['cat_id']] = $row['cat_name'];        

        // check for subcategories
        $r2 = mysql_query("SELECT cat_id,cat_name FROM categories WHERE cat_mother='".$row['cat_id']."'");    
        while ($subrow=mysql_fetch_assoc($r2)) 
        {
            $cat[$subrow['cat_id']] = ' - '.$subrow['cat_name'];                

            // check if there is subcats for the current subcategory
            $r3 = mysql_query("SELECT cat_id,cat_name FROM categories WHERE cat_mother='".$subrow['cat_id']."'");    
            while ($subrow2=mysql_fetch_assoc($r3)) 
            {
                $cat[$subrow2['cat_id']] = ' -- '.$subrow2['cat_name'];     

                // check if there is subcats for the current subcategory 
                $r4 = mysql_query("SELECT cat_id,cat_name FROM categories WHERE cat_mother='".$subrow2['cat_id']."'");    
                while ($subrow3=mysql_fetch_assoc($r4)) 
                {
                    $cat[$subrow3['cat_id']] = ' --- '.$subrow3['cat_name'];
                }                   
            }
        }           
    } 
    return $cat;
}
4

2 に答える 2

0

これを試して:

SELECT l1.cat_id AS l1_cat_id
    ,l1.cat_name AS l1_cat_name
    ,l2.cat_id AS l2_cat_id
    ,l2.cat_name AS l2_cat_name
    ,l3.cat_id AS l3_cat_id
    ,l3.cat_name AS l3_cat_name
    ,l4.cat_id AS l4_cat_id
    ,l4.cat_name AS l4_cat_name
FROM categories AS l1
JOIN categories AS l2
  ON l2.cat_mother = l1.cat_id
JOIN categories AS l3
  ON l3.cat_mother = l2.cat_id
JOIN categories AS l4
  ON l4.cat_mother = l3.cat_id
WHERE l1.cat_mother=0 OR l1.cat_mother='' 
ORDER BY l1_cat_name, l2_cat_name, l3_cat_name, l4_cat_name
于 2013-10-13T19:22:19.183 に答える