如何从相关表中对SQL中的结果进行分组?

时间:2013-09-25 13:04:41

标签: php sql sql-optimization

这与earlier question I posted有关,但不幸的是我认为我没有清楚地说明我的问题,因为我没有得到我问题的完整答案。

我有两个表,一个叫做Groups,另一个叫做Items。我想要做的是选择所有组,然后在每个组中选择所有项目,所以我最终得到这样的结果:

标题1 < - 组

  • One< - Item
  • 两个< - Item

标题2 < - 组

  • One< - Item
  • 两个< - Item

在我的原始帖子中,您可以看到我以前用来实现此目的的代码,这实际上是循环中的循环,首先选择所有组,然后选择组中的所有项目。我知道在SQL查询循环中有一个SQL查询循环是个坏主意,所以感谢一些有用的SO成员我现在有了这个代码:

$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."); 
                } 
    } 

这会选择所有具有相应项目的组,但不会对其组标题下的所有项目进行分组,因此我最终会得到如下结果:

标题1

标题1

  • 两个

如何修改此项以便所有组仅列出一次,并且每个组的所有项目都正确列在组标题下?

1 个答案:

答案 0 :(得分: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'];
  }