如何从相关表中对 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) 从两个表中检索数据并对结果进行分组