2016-03-10 32 views
0

我遇到了一個問題,在無序列表中排序並顯示數據庫中的類別。在無序列表中顯示類別

我寫了這個代碼來完成任務:

$roots = $GLOBALS['sql']->query("SELECT `id`,`name` FROM `category` WHERE `parent`='0'"); 
$out = '<ul>'; 
foreach($roots as $root){ 
    $out .= '<li>'.$root['name'].'<ul>'; 
    $downs = $GLOBALS['sql']->query("SELECT `id`,`name` FROM `category` WHERE `parent`='".$root['id']."'"); 
    foreach($downs as $down){ 
     $out .= '<li>'.$down['name'].'<ul>'; 
     $bots = $GLOBALS['sql']->query("SELECT `name` FROM `category` WHERE `parent`='".$down['id']."'"); 
     foreach($bots as $bot){ 
      $out .= '<li>'.$bot['name'].'</li>'; 
     } 
     $out .= '</ul></li>'; 
    } 
    $out .= '</ul></li>'; 
} 
$out .= '</ul>'; 
return str_replace('<ul></ul>', '', $out); 

這似乎有一個很長的運行時間,如果有許多類別。有沒有更高效的方法? 或者一般來說,PHP數組處理比MySQL查詢更快嗎?

編輯: 我試圖加入表和這個查詢我得到了正確的表。

SELECT 
     root.name AS root_name, 
     down1.name AS down1_name, 
     down2.name AS down2_name 
FROM 
      category AS root 
    LEFT JOIN category AS down1 ON down1.parent = root.id 
    LEFT JOIN category AS down2 ON down2.parent = down1.id 
WHERE 
     root.parent = '0' 
ORDER BY 
     root_name, down1_name, down2_name 

但是,我如何處理這個表在PHP中得到無序列表?這是甚至更快?

+0

看起來你需要[加入](http://dev.mysql.com/doc/refman/5.7/en/join.html)MySQL中的三張表 –

+0

這就是我最初做的,但不知道如何繼續。這是我的MySQL: –

+0

SELECT'root'.'name' as'root_name','down1'.'name' as'down1_name','down2'.'name' as''down2_name' FROM'category' as'root' LEFT JOIN'category' as'down1' ON'down1'.'parent' ='root'.'id' LEFT JOIN'category' as'down2' ON'down2'.'parent' ='down1'.'id' WHERE'root'.'parent' ='0'ORDER BY'root_name','down1_name','down2_name' –

回答

0

嘗試這樣:

$rows = $GLOBALS['sql']->query(" 
    SELECT 
     root.name AS root_name, 
     down1.name AS down1_name, 
     down2.name AS down2_name 
    FROM category AS root 
    LEFT JOIN category AS down1 ON down1.parent = root.id 
    LEFT JOIN category AS down2 ON down2.parent = down1.id 
    WHERE root.parent = '0' 
    ORDER BY root_name, down1_name, down2_name 
"); 

$tree = array(); 
foreach ($rows as $row) { 
    $tree[$row['root_name']][$row['down1_name'] = $row['down2_name']; 
} 

$out = ''; 
foreach ($tree as $rootName => $root) { 
    $out .= "<li>{$rootName}<ul>"; 
    foreach ($root as $down1Name => $down1) { 
     $out .= "<li>{$down1Name}<ul>"; 
     foreach ($down1 as $down2Name) { 
      $out .= "<li>{$down2Name}</li>"; 
     } 
     $out .= "</ul></li>"; 
    } 
    $out .= "</ul></li>"; 
} 

在第一循環(foreach ($rows as $row))你建立一個樹形結構的陣列。在第二個嵌套循環中,構建HTML結構。

+0

它的工作原理,但會引發一些警告:爲foreach()提供的無效參數。它指的是最裏面的foreach –

+0

哦!我知道爲什麼。其中一些沒有2個子類別,只有一個子類別。所以我只需在進入循環 –

+0

Paul之前檢查一下,可能會在連接之後運行,這會使查詢變慢。你需要在第一次連接中檢查parent = 0,以便不搜索不需要的東西。 –

0

嘗試此查詢:

select main_cat.name as main_category, sub_cat.name as sub_category, group_join(',', bot_cat.name) as bot_categories 
from category main_cat 
join category sub_cat 
on (main_cat.parent = 0) and (sub_cat.parent = main.cat.id) 
join category bot_cat 
on bot_cat.parent = sub_cat.id 
group by main_cat.name, sub_cat.name 
order by main_cat.name, sub_cat.name 

這將導致設置三列的結果:

  • main_category將成爲主要的類別名稱
  • sub_category會的名稱subcactegory
  • bot_categories將是機器人類別的逗號分隔值集

查詢按類別名稱和子類別名稱分組,並按這些值排序。

PHP用法:

$previousCategory = null; 
$categories = $GLOBALS['sql']->query(" 
    select main_cat.name as main_category, sub_cat.name as sub_category, group_join(',', bot_cat.name) as bot_categories 
    from category main_cat 
    join category sub_cat 
    on (main_cat.parent = 0) and (sub_cat.parent = main.cat.id) 
    join category bot_cat 
    on bot_cat.parent = sub_cat.id 
    group by main_cat.name, sub_cat.name 
    order by main_cat.name, sub_cat.name 
"); 

foreach ($categories as $category) { 
    $newCat = ($category["main_category"] !== $previousCategory); 
    $previousCategory = $category["main_category"]; 
    if ($newCat) { 
     //Handle new cat start 
    } 
    //Handle subcategory start ($category["sub_category"]) 
    $bots = explode(',', $category['bot_categories']); 
    foreach ($bots as $bot) { 
     //Handle bot category 
    } 
    //Handle subcategory end ($category["sub_category"]) 
    if ($newCat) { 
     //Handle new cat end 
    } 
} 

說明:

你的程序是緩慢的,因爲它有發送查詢根類別,查詢每個根類別,以獲得他們的子類別和查詢爲每個子類別獲取他們的機器人類別。這導致了很多請求被髮送到數據庫。相反,你可以用一個查詢來解決你的問題。

相關問題