2012-06-12 71 views
1

我有兩個表A和B,它們在AB_xref中一起被xref。在從B表中獲取數據的過程中,我將A行中的所有行記錄到一個數組中,然後循環遍歷每個索引,查找與該A行相關的多個B行。然後,我將B中的行拼接到A中的行數組中 - 創建一個嵌套數組。mySQL - 在單個select中使用xref表從相關表中獲取數據

有沒有辦法使用單個選擇和條件來做到這一點?

+0

你可以給你的表的樣本,你想要的輸出是什麼?並不一定是整個數據集,但一個簡單的例子,我敢肯定,我們可以找出一些 –

+0

當然,表「包」有ID,名稱等「活動」有ID,名稱等「package_activity_xref」有package_id,activity_id。我試圖讓輸出成爲一個數組,其中每個包是索引,在該索引內是該包的列信息,然後是與該包相關的每個活動的數組。其基本上是輸出到一個包選擇器的HTML。我有一個使用「while」工作的版本,它將每個軟件包呈現爲li,並將這些活動作爲li的內容呈現,但這似乎是一種笨拙的處理方式。 – adm351

回答

0

看看這個地方靠近讓你的地方,你想:

查詢:

SELECT 
    packages.name AS package_name, 
    activities.name AS activity_name 
FROM 
    package_activity_xref pax 
INNER JOIN packages ON packages.id = pax.package_id 
INNER JOIN activities ON activities.id = pax.activity_id 

PHP:

$results = get_assoc_array_from_sql($your_query); 
$outputArray = array(); 

foreach($results as $result) { 
    if (array_key_exists($result['package_name'], $outputArray)) { 
     // we already have an array at this package, push the new item 
     array_push($outputArray[$result['package_name']], $result['activity_name']); 
    } else { 
     // the target array doesn't exist yet, make it 
     $outputArray[$result['package_name']] = array($result['activity_name']); 
    } 
} 

基本上,此代碼將通過整個外部參照循環表一次(O(n)其中n是外部參照中的記錄數)。對於每條記錄,它將查看包名,並查看$outputArray中是否存在密鑰。如果沒有,請將該鍵的值作爲當前活動名稱的數組。如果它存在,則將當前活動附加到該數組。

如果在執行後執行print_r($outputArray),則應該看到一個包含x項的數組,其中x是不同軟件包的數量。陣列中的每個元素將是另一個陣列,其中y元素,其中y是給定包的活動數量。

注意:您將需要自行實施get_assoc_array_from_sql,但我認爲您要麼已經使用了某些實現,要麼您正在使用mysqli_fetch_assoc()或類似的東西。

相關問題