2013-09-25 47 views
0

我目前有兩個相關的表,一個用於'組',另一個用於'項目'。項目按照關聯的組ID存儲在組中。非常基本的表關係,但不幸的是我的SQL不是很好,所以我不確定什麼是循環遍歷所有組的最佳方式,並且在它們內循環遍歷所有項目,最終得到由它們的組分類的所有項目的列表。如何使用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之外。

我也想能夠不顯示沒有項目的組,但是我不能用這個代碼真正做到這一點。能夠在一個查詢中獲得所有組和關聯項目的最佳方式是什麼,以及能夠僅指定選擇具有關聯項目的組?

回答

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"; 
+0

感謝您的幫助,但不幸的是,這並不適合我,因爲它似乎選擇沒有項目的組。我還想訂購結果,以便每個組描述都列出一次,並且所有項目都列在該組下。我將如何實現這一目標? – Roy

+0

將LEFT JOIN更改爲INNER JOIN。如果這不起作用,請嘗試右連接。 – jeff

0

我覺得,這是件好事,u可以使用一個查詢,爲前:

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排序,但更好的主意是你的解決方案。

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 

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

+0

謝謝,這有效,但是我如何循環它,所以我只打印組描述一次,但打印它下面的組的所有項目? – Roy