2013-09-25 5 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

을 가지고 당신의 시도 : 그룹의 설명과 함께, 당신은 모든 항목에 테이블을 얻을 것이다

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 

:

나는 이것이 좋은 생각
$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으로 변경하십시오. 그래도 작동하지 않으면 RIGHT JOIN을 시도하십시오. – jeff

0

, u는 예를 들어, 하나 개의 쿼리를 사용할 수 있습니다 그룹 설명은 항목 옆에 중복됩니다. U는 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