2011-01-27 67 views
2

我正在尋求一些關於使用MySQL和PHP檢索和顯示數據的最佳方法的建議。PHP和MySQL - 高效地處理多個一對多關係

我有3個表,所有的1對多的關係如下:

每個SCHEDULE有許多覆蓋每個覆蓋有許多地點。我想檢索這些數據,以便它們都可以顯示在一個PHP頁面上,例如列出我的時間表。在每個時間表中列出OVERRIDES,並在每個覆蓋列表中包含LOCATIONS。

選項1 - 是否最好的方法做到這一點,使3個單獨的SQL查詢,然後將它們寫入一個PHP對象?然後,我可以遍歷每個數組並檢查父數組上的匹配。

選項2 - 我已經考慮了很多關於連接的問題,但是做兩個正確的連接會爲我返回所有3個表中的每個入口。

任何想法和意見,將不勝感激。

最好的問候,本。

回答

5

如果你真的想要每一塊數據,無論你怎麼做,你都會檢索相同數量的行。最好在一個查詢中得到它。

SELECT schedule.id, overrides.id, locations.id, locations.name 
FROM schedule 
JOIN overrides ON overrides.schedule_id = schedule.id 
JOIN locations ON locations.override_id = overrides.id 
ORDER BY schedule.id, overrides.id, locations.id 

通過訂購的結果是這樣,你可以在結果集中迭代,並移動到下一個日程每當scheduleid變化,下一個位置時locationid變化。

編輯:如何把這些數據轉化爲三維陣列中的可能的例子 -

$last_schedule = 0; 
$last_override = 0; 
$schedules = array(); 

while ($row = mysql_fetch_array($query_result)) 
{ 
    $schedule_id = $row[0]; 
    $override_id = $row[1]; 
    $location_id = $row[2]; 
    $location_name = $row[3]; 
    if ($schedule_id != $last_schedule) 
    { 
    $schedules[$schedule_id] = array(); 
    } 
    if ($override_id != $last_override) 
    { 
    $schedules[$schedule_id][$override_id] = array(); 
    } 
    $schedules[$schedule_id][$override_id][$location_id] = $location_name; 
    $last_schedule = $schedule_id; 
    $last_override = $override_id; 
} 

相當原始的,我想你的代碼看起來不同,但希望它有一定的道理。

+0

對於基本的db概念+1。 – 2011-01-27 19:23:46