簡體   English   中英

如何使用SQL避免循環內查詢

[英]How to use SQL to avoid queries within loops

我目前有兩個相關的表,一個用於“組”,另一個用於“項目”。 項目通過關聯的組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之外。

我還希望不能顯示沒有項目的組,但是我無法使用此代碼真正做到這一點。 能夠在一個查詢中獲取所有組和關聯項目以及僅指定具有關聯項目的選擇組的最佳方法是什么?

嘗試過:

$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";

我認為,這很好,您可以使用一個查詢,例如:

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

您將獲得一個表,其中包含所有項目以及組說明,但是組說明將在項目旁邊重復。 U可以按foreach進行排序,但是更好的主意是您的解決方案。

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

該查詢將返回帶有相應項目的所有組。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM