2015-05-04 42 views
0

我有一個數據庫結構類似如下:從PHP如何在SQL Server中有效執行此搜索?

Table A: PersonId, GroupId 
Table B: GroupId, ParentGroupId 

給定一個PersonId,我想找到的所有的人的ID在該人的小組的父組。

首先我選擇ParentGroupId給定的PersonId,加入B。然後我做一段時間的循環,根據GroupIdA中選擇並記錄PersonId,然後繼續循環,從B獲取下一個ParentGroupId

這是一個有效的方法來做這個搜索,或者是否有一個選項,不涉及一段時間以這種方式「冒泡」?

(這是實際情況的一個簡化版本,更改架構不是一個選項)

$sql = 'SELECT ParentGroupID FROM A WHERE PersonId = ' . $id; 
    $result = $db->query($sql); 
    $row = $db->fetch_array($result); 
    $parent_group = $row['ParentGroupId']; 

    if(!is_null($parent_group)) { 

     $parent_ids = array(); 

     while($parent_group > 0) { 
      //is there a way to do this where I retrieve all managers <= lvl 6 at once, so I don't have to loop in order to 'tier up'? 
      $sql = 'SELECT ParentGroupID, PersonID 
        FROM B 
        INNER JOIN A on ParentGroupID = A.GroupID 
        WHERE ParentGroupID = ' . $parent_group; 

      $result = $db->query($sql); 
      $row = $db->fetch_array($result); 
      $parent_group = $row['ParentGroupID']; 
      $parent_ids[] = $row['PersonID']; 
     } 
    } 
+0

添加您的SQL請 – cmorrissey

+0

是什麼讓yoo認爲查詢效率低下? – Mihai

+2

@Mhaihai對循環的每個循環做的另一個查詢是低效的定義。 –

回答

1

你兩個查詢組合成一個會更有效:

$sql = 'SELECT ParentGroupID, PersonID 
    FROM B 
    INNER JOIN A on ParentGroupID = A.GroupID 
    WHERE ParentGroupID IN (
    SELECT ParentGroupID FROM A WHERE ParentGroupID > 0 
    AND PersonId = ' . $id .')' ; 
+1

@ Don'tPanic His代碼似乎不是遞歸的,它只是讓所有擁有與用戶相同的父組的用戶(如果我正確讀取的話)。從這個問題來看:「給定一個PersonId,我想找到該組人員中所有人的Id。」 –

+0

好吧,它'遞歸'了父組結構。一個組有一個父母,有一個父母等等,並且代碼迭代,記錄PersonIds,只要一個人的組有父母。 – ab11

相關問題