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

Posted

技术标签:

【中文标题】如何从相关表中对 SQL 中的结果进行分组?【英文标题】:How to group results in SQL from related tables? 【发布时间】:2013-09-25 13:04:40 【问题描述】:

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

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

标题 1

一个 两个

标题 2

一个 两个

在我的原始帖子中,您可以看到我最初用于实现此目的的代码,它本质上是一个循环内的循环,首先选择所有组,然后选择组内的所有项目。我知道在 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

两个

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

【问题讨论】:

SQL 查询似乎很完美。尝试使用 SELECT * FROM ... 并从 array('field_name') 获取特定值。 @RonakPatel 查询本身很好,我想知道的是如何对所有结果进行分组,以便每个组标题只显示一次,并且所有相关项目都列在它下面? ok.. 为此,您需要使用 for 循环。 $groups[$i]['ItemDescription']。您需要使用另一个查询来计算每个可能的元素并将该值与 for 循环限制绑定。 @RonakPatel 在循环中使用 SQL 查询是我试图通过这段代码避免的。我链接到的原始代码在循环中使用了 SQL 查询,但在非常大的列表中,这会很快消耗大量服务器资源 没有。我不是告诉你把你的 sql 查询放在循环中。但您需要获取同一组下的所有项目。因此,您需要将所有项目都放入 for 循环中。 【参考方案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
        elsetrigger_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'];
  

【讨论】:

以上是关于如何从相关表中对 SQL 中的结果进行分组?的主要内容,如果未能解决你的问题,请参考以下文章

SQL Query (SQL Server 2008) 从两个表中检索数据并对结果进行分组

SQL Server:在保留保留NULL结果的同时,对联接表中的一个字段进行分组

SQL查询如何对增量键RANK中的相同结果进行单独分组

通过获取所有表结果对每行进行分组

如何从单个表中对多行进行分组并获取给定范围内的所有记录

如何在 SQL 中进行转换和分组