2013-09-25 2 views
1

Это связано с earlier question I posted, но, к сожалению, я не думаю, что достаточно четко сформулировал свою проблему, так как не получил полного ответа на мой вопрос.Как группировать результаты SQL из связанных таблиц?

У меня есть две таблицы, одна из которых называется Groups и одна называется Items. То, что я хотел бы сделать, это выбрать все группы, а затем в каждой группе выбрать все элементы, так что я в конечном итоге с чем-то вроде этого:

Heading 1 < - Группа

  • Один < - Item
  • Два < - Item

Заголовок 2 < - Группа

  • Один < - Item
  • Два < - Item

В моем оригинальном посте вы можете увидеть код, я использовал для первоначально достижения этой цели, которая была по существу петля в петлю первого выбора всех групп, то все элементы внутри группы. Я знаю, имеющий цикл SQL запросов в цикле SQL запроса является плохой идеей, так что благодаря некоторым полезным С.О. членам теперь у меня есть этот код:

$query = "SELECT g.ID AS GRPID, g.Description AS GrpDesc,i.ID AS ITEM_ID, i.Description AS ItemDescription 
       FROM Groups_Inv g 
      LEFT JOIN Items_Inv i 
      ON g.ID=i.grpID 
      ORDER BY g.SortNum ASC"; 
    try { 
       $result = odbc_exec($connect,$query); 
       if($result){ 
        while ($groups = odbc_fetch_array($result)) { 

      echo "<li title='".$groups['GrpDesc']."' class='category'> 
       <h3><span><a class='category'>".$groups['GrpDesc']."</a></span></h3> 
       <ul class='sub-menu'>\n"; 

      echo "<li class='select'> 
       <input type='radio' class='addRow'> 
        <label for='".$groups['ITEM_ID']."'> 
        ".$groups['ItemDescription']." 
        </label> 
        </li>\n"; 

      echo "</ul> 
       </li>\n"; 
     } 
       } 
       else { 
     throw new RuntimeException("Failed to connect."); 
       } 
    } 

Это выбирает все группы, которые имеют соответствующие элементы, но это не делает группа все элементы под их заголовком группы, так что я в конечном итоге с результатами, как это:

Heading 1

  • Один

Заголовок 1

  • Два

Как я могу изменить это так, чтобы все группы перечислены только один раз, и все элементы для каждой группы правильно перечислены под заголовком группы?

+1

SQL-запрос кажется идеальным. попробуйте использовать SELECT * FROM ... и выберете определенные значения из массива ('field_name'). –

+0

@RonakPatel Сам вопрос в порядке, я хочу знать, как мне группировать все результаты, чтобы каждый заголовок группы показывался только один раз, и все связанные элементы перечислены ниже? – Roy

+1

ok .. для этого вам нужно использовать для цикла. $ групп [$ я] [ 'ItemDescription']. вам нужно использовать другой запрос для подсчета всех возможных элементов и привязать это значение к пределу цикла. –

ответ

1

Дайте мне знать, если у вас возникли проблемы с этим кодом. Я использовал отдельный класс для запроса.

class tank extends mysqli{ 
public function curr_group_content($a) 
{ 
    $query ="SELECT g.ID AS GRPID, g.Description AS GrpDesc,i.ID AS ITEM_ID, i.Description AS ItemDescription 
        FROM Groups_Inv g 
        LEFT JOIN Items_Inv i 
        ON g.ID=i.grpID 
        ORDER BY g.SortNum ASC"; 

     if ($stmt = parent::prepare($query)){ 
      $stmt->execute(); 
      $meta = $stmt->result_metadata(); 

      while ($field = $meta->fetch_field()) { 
       $parameters[] = &$row[$field->name]; 
      } 

      call_user_func_array(array($stmt, 'bind_result'), $parameters); 

       while ($stmt->fetch()) { 
        $x = array(); 
        foreach($row as $key => $val) { 
        $x[$key] = $val; 
        } 
        $results[] = $x; 
       }  

      return $results; 
      $stmt->close(); 
     }//END PREPARE 
     else{trigger_error($this->error, E_USER_NOTICE);} 
} 
} 

$clients = new tank(); 
$data = array(); 
$events = $clients->curr_group_content(); 
$eventscount = sizeof($events); 
    for($i=0;$i<$eventscount;$i++){ 
    $data['item'][] = $events[$i]['item']; 
    } 
Смежные вопросы