2011-10-07 99 views
1

我正在開發一個簡單的系統,在每個類別中都有無限的類別和項目。例如,可能有類別內的類別(類別1 - >類別2 - >類別3)都包含項目。我想要顯示每個類別及其所有子類別的總項目。我正在試圖找出一個循環來做到這一點,但基本上我會做得很少。我正在建設PHP/MySQL。我的分類表模式是類別(id,id_parent)id是自動增量,id_parent是它是否位於另一個類別(0是默認值)。我的項目架構是項目(id,id_category)。顯然還有其他專欄,但這些是我認爲唯一重要的。有人可以幫助我開發一個循環結構,併爲它們所在類別提供總數量的項目(也計算所有子類別項目)。儘管我覺得這是非常非常錯誤的,但這是我開始的。MySQL計數所有的孩子,無論有多少

function CountChildDownloads($id_category) 
{ 
global $smcFunc; 
$x = array(); 
$total = 0; 

$request = $smcFunc['db_query']('', ' 
    SELECT COUNT(*) AS items FROM {db_prefix}xld_downloads 
    WHERE id_category = '.$id_category.'' 
); 

$total += $request['items']; 

$request = $smcFunc['db_query']('', ' 
    SELECT id FROM {db_prefix}xld_categories 
    WHERE id_parent = '.$id_category.'' 
); 

if($smcFunc['db_num_rows']($request) > 0) { 
    while($row = $smcFunc['db_fetch_assoc']($request)) { 
     $x[] = $row['id']; 
    } 
} 

foreach ($x as $id) 
{ 
    $y = array(); 
    $z = 0; 

    $request = $smcFunc['db_query']('', ' 
     SELECT COUNT(*) AS items FROM {db_prefix}xld_downloads 
     WHERE id_category = '.$id.'' 
    ); 

    $z += $request['items']; 

    $request = $smcFunc['db_query']('', ' 
     SELECT id FROM {db_prefix}xld_categories 
     WHERE id_parent = '.$id.'' 
    ); 

    if($smcFunc['db_num_rows']($request) > 0) { 
     while($row = $smcFunc['db_fetch_assoc']($request)) { 
      $y[] = $row['id']; 
     } 
    } 

    while (count($y) > 0) 
    { 
     $id_y = $y[0]; 

     $request = $smcFunc['db_query']('', ' 
      SELECT id FROM {db_prefix}xld_categories 
      WHERE id_parent = '.$id_y.'' 
     ); 

     if($smcFunc['db_num_rows']($request) > 0) { 
      while($row = $smcFunc['db_fetch_assoc']($request)) { 
       $y[] = $row['id']; 
      } 
     } 

     $request = $smcFunc['db_query']('', ' 
      SELECT COUNT(*) AS items FROM {db_prefix}xld_downloads 
      WHERE id_category = '.$id_y.'' 
     ); 

     $z += $request['items']; 

     unset($y[0]); 
     array_values($y); 
    } 

    $total += $z; 
} 

return $total; 
} 

$ smcFunc只是系統的查詢方式。它是一個MySQL後端。

工作函數(如果不使用SMF,需要更新到標準的MySQL調用)感謝盧卡斯。

function CountChildDownloads($id_category) 
{ 
global $smcFunc; 
$x = array(); 
$total = array(); 
$total['downloads'] = 0; 
$total['views'] = 0; 

$request = $smcFunc['db_query']('', ' 
    SELECT views FROM {db_prefix}xld_downloads 
    WHERE id_category = '.$id_category.'' 
); 

if($smcFunc['db_num_rows']($request) > 0) { 
    while($row = $smcFunc['db_fetch_assoc']($request)) { 
     $total['downloads']++; 
     $total['views'] += $row['views']; 
    } 
} 

$request = $smcFunc['db_query']('', ' 
    SELECT id FROM {db_prefix}xld_categories 
    WHERE id_parent = '.$id_category.'' 
); 

if($smcFunc['db_num_rows']($request) > 0) { 
    while($row = $smcFunc['db_fetch_assoc']($request)) { 
     $x[] = $row['id']; 
    } 
} 

foreach ($x as $id) 
{ 
    $y = array(); 
    $z = 0; 
    $w = 0; 

    $request = $smcFunc['db_query']('', ' 
     SELECT views FROM {db_prefix}xld_downloads 
     WHERE id_category = '.$id.'' 
    ); 

    if($smcFunc['db_num_rows']($request) > 0) { 
     while($row = $smcFunc['db_fetch_assoc']($request)) { 
      $z++; 
      $w += $row['views']; 
     } 
    } 

    $request = $smcFunc['db_query']('', ' 
     SELECT id FROM {db_prefix}xld_categories 
     WHERE id_parent = '.$id.'' 
    ); 

    if($smcFunc['db_num_rows']($request) > 0) { 
     while($row = $smcFunc['db_fetch_assoc']($request)) { 
      $y[] = $row['id']; 
     } 
    } 

    while (count($y) > 0) 
    { 
     $id_y = $y[0]; 

     if (!empty($id_y)) 
     { 
      $request = $smcFunc['db_query']('', ' 
       SELECT id FROM {db_prefix}xld_categories 
       WHERE id_parent = {int:id_parent}', 
       array(
        'id_parent' => $id_y, 
       ) 
      ); 

      if($smcFunc['db_num_rows']($request) > 0) { 
       while($row = $smcFunc['db_fetch_assoc']($request)) { 
        $y[] = $row['id']; 
       } 
      } 

      $request = $smcFunc['db_query']('', ' 
       SELECT views FROM {db_prefix}xld_downloads 
       WHERE id_category = {int:id_category}', 
       array(
        'id_category' => $id_y, 
       ) 
      ); 

      if($smcFunc['db_num_rows']($request) > 0) { 
       while($row = $smcFunc['db_fetch_assoc']($request)) { 
        $z++; 
        $w += $row['views']; 
       } 
      } 
     } 

     unset($y[0]); 
     $y = array_values($y); 

    } 

    $total['downloads'] += $z; 
    $total['views'] += $w; 
} 

return $total; 
} 
+0

待辦事項你需要PHP中的響應或者只是一個僞代碼的答案? PHP中的 – Lucas

+0

最好只是爲了確保我完全理解,但如果它是僞代碼,我可能會弄清楚它。不管你有多少不便。 –

+0

母羊全球變種...... – BRampersad

回答

1

(有許多方法來嵌套循環/查詢...的結構改變想法是有一個單獨的表,列出了每個類別的所有孩子..並確保它不僅具有即時孩子,它也有子孩子和子孩子......如1有孩子2,2有孩子3,1有孩子3,3有孩子5,1有孩子5等。)BUT ,針對當前情況。

一個循環結構可以是:

啓動結果集。 || 查詢所有類別id,其中parent = 0將每個添加到數組(X)。 || 關閉結果集。

對於陣列(X)的每個ID:

  • 建立一個新的計數變量(z)表示。
  • 建立一個新的子id數組(Y)。

  • 開始結果集。 || 查詢次數*對於所有具有category =當前id x ||的項目 加入計數變量(z)|| 關閉結果集。

  • 開始結果集。 || 查詢所有類別id,其中parent =當前id x || 將全部添加到子ID數組(Y)。 || 關閉結果集。

  • 而在陣列(Y)

  • 開始結果集子陣列(Y)的長度> 0

    • 類別ID Y =第一項。 || 查詢所有類別id,其中parent =當前id y。 || 將全部添加到子ID數組(Y)。 || 關閉結果集。

    • 開始結果集。|| 對於所有類別=當前id y的項目,查詢計數* 加入計數變量(z)|| 關閉結果集。

    • 從數組中刪除第一項(Y)

  • 繼續while循環

  • 在這一點上,你有類別ID x中的最後一個項目數(Z)...做某事有了它,然後用持續循環

結束for循環

+0

謹慎的一句話:這不檢查任何無限循環。可以修改它,但是我想提供一個更簡單的答案,假設你沒有任何無限循環。 (例如,1有孩子5,5有孩子1)。 – Lucas

+0

我已經修改我的帖子上面使用你的技術(我相信),如果我做CountChildDownloads(2)時,我仍然收到0結果,當我知道類別2有1下載。也許仔細看看,看看我要去哪裏錯了。 –

+0

我不是100%熟悉PHP,但我注意到一些事情:1)在for循環中,第一個查詢應該是$ id而不是$ category。 2)同樣的事情,但對於while循環中的第二個查詢,應該是$ id_y而不是$ category。 3)它看起來並不像將新的子子數組添加到(Y)數組那樣,只是執行查詢然後繼續。 ---- 4)由於你是從一個類別開始的(不僅僅是查看所有類別),你需要在啓動for循環之前執行一次計數並將其添加到總計中。 – Lucas

相關問題