如何使用SQL来避免循环内的查询

时间:2013-09-25 10:15:07

标签: php sql loops sql-optimization

我目前有两个相关的表,一个用于“组”,另一个用于“项目”。项目按关联的组ID存储在组中。非常基本的表关系,但不幸的是我的SQL不是很好,所以我不确定循环所有组的最佳方法是什么,并且在其中循环遍历所有项目以最终得到由其组分类的所有项目的列表。

目前我有这段代码:

$query = "SELECT ID AS GRPID, Description FROM Groups_Inv ORDER BY SortNum ASC";
try { 
  $result = odbc_exec($connect,$query); 
  if($result){ 
    while ($groups = odbc_fetch_array($result)) {
      echo "<li title='".$groups['DESCRIPTION']."' class='category'>
            <h3><span><a class='category'>".
              $groups['DESCRIPTION'].
           "</a></span></h3><ul class='sub-menu'>\n";
      $subquery = "SELECT ID AS ITEM_ID, Description
                   FROM Items_Inv WHERE grpID = ".$groups['GRPID']."";
      $subresult = odbc_exec($connect,$subquery);
      while ($items = odbc_fetch_array($subresult)) {
        echo "<li class='sub_item' title='".$items['DESCRIPTION']."'>
              <input type='radio' class='addRow'>
                <label for='".$items['ITEM_ID']."'>".
                  $items['DESCRIPTION'].
               "</label></li>\n";
      }
      echo "</ul></li>\n";
    }
  } 
  else{ 
    throw new RuntimeException("Failed to connect."); 
  } 
} 
catch (RuntimeException $e) { 
  print("Exception caught: $e");
}

我知道在循环中进行SQL查询是一个非常糟糕的想法,这就是为什么我想优化这段代码,但遗憾的是我对SQL的知识在基本的CRUD之外非常有限。

我也希望能够不显示没有项目的组,但我不能用这段代码真正做到这一点。在一个查询中获取所有组和关联项目的最佳方法是什么,以及是否只能指定选择具有关联项目的组?

3 个答案:

答案 0 :(得分:0)

尝试过:

$query = "SELECT ID AS GRPID, Description, ID AS ITEM_ID, Description AS ITEM_DESC
FROM Groups_Inv 
LEFT JOIN Items_Inv ON (Groups_Inv.ID = ITEM_Inv.ID)
ORDER BY SortNum ASC";

答案 1 :(得分:0)

我认为,这很好,你可以使用一个查询,例如:

SELECT ii.ID AS ITEM_ID, ii.Description AS item_desc, gi.Description AS group_desc  FROM Items_Inv ii INNER JOIN Groups_Inv gi ON ii.grpID=gi.ID

您将获得包含所有项目的表格,其中包含组说明,但组项说明将在项目旁边重复。你可以通过foreach排序,但更好的想法是你的解决方案。

答案 2 :(得分:0)

SELECT g.ID AS GRPID, g.Description AS GrpDesc,i.ID AS ItemId, i.Description AS ItemDescription
FROM Groups_Inv g
LEFT JOIN Items_Inv i
ON g.ID=i.grpID
ORDER BY g.SortNum ASC

此查询将返回包含相应项目的所有组。