2016-02-24 1 views
1

У меня есть две таблицы: категория и объект. В категории может быть один или несколько детей. У этих детей могут быть свои дети. Итак, иерархия безгранична. У ребенка может быть только один родитель. Родительская категория - это категория, где parent_id - NULL. У категории есть объекты (от одного до многих отношений).Как подсчитать элементы в родительской категории и ее потомках?

Образец данных:

Категория стол

id name  parent_id  
1 Sports  NULL 
2 Home  NULL 
3 Fashion NULL 
4 Cycling 1 
5 Football 1 
6 Bath  2 
7 Bedroom 2 
8 Lighting 7 

Предположим, что число объектов в категории выглядит следующим образом:

name  COUNT(object) 
Sports  5 
Home  3 
Fashion 4 
Cycling 2 
Football 3 
Bath  2 
Bedroom 1 
Lighting 3 

мне нужно получить количество объектов только для родителей включая количество объектов в своих потомках, используя чистые MySql или MySql и PHP.

Вот результат, который я ищу.

Sports  5 + 2(for Cycling)+3(for Football) = 10 
Home  3+2(Bath)+1(Bedroom)+3(Lighting)= 9 
Fashion 4 

Я знаю о вложенных наборах, но не могу изменить текущую структуру БД.

ответ

0

следующий код PHP может решить эту проблему, Может быть, есть лучший ответ, но то, что я должен теперь сказать

<?php 
try{ 
    $conn = new PDO('mysql:host=localhost;dbname=test', 'root', 'root'); 
    $stm = $conn->prepare('select tem.id, tem.num, c.name, c.parent_id from category c inner join (SELECT c.id ,count(c.id) as num FROM `category` c left join object o on o.category = c.id 
group by c.id) tem on c.id = tem.id'); 
    $stm->execute(); 
    $result = $stm->fetchAll(PDO::FETCH_OBJ); 
    $temp = array(); 
    foreach($result as $row){ 
     $temp[$row->id] = $row; 
    } 


    $pre_final = moh($temp); 
    $final = array(); 
    foreach ($pre_final as $row){ 
      if(!$row->parent_id){ 
       $final[] = $row; 
      } 
    } 

    print_r($final); 
} 
catch(PDOException $e){ 
    print "Error!: " . $e->getMessage() . "<br/>"; 
    die(); 
} 

function moh($arr){ 
    $flag = true; 
    foreach($arr as $row){ 
     if(!$row->parent_id){ 

     } else{ 
      $arr[$row->parent_id]->num += $row->num; 
      $row->num = 0; 
     } 
    } 



    foreach($arr as $row){ 
     if(!$row->parent_id){ 

     } else{ 
      if($row->num != 0){ 
       $flag = false; 
       break; 
      } 
     } 
    } 

    if($flag){ 
     return $arr; 
    } else{ 
     return moh($arr); 
    } 


} 
Смежные вопросы