2013-10-27 37 views
0

我有一個包含用於構建網頁的內容4個的關係表的數據庫:PHP PDO MySQL的查詢 - 最有效的方法

content rel  theme  theme_meta 

relcontentIDcontent表匹配到相應的rel字段的theme表。 theme_meta有一個名爲themeID的字段,它將其鏈接到theme表。

所以

當此刻構建頁面我JOIN內容表中刪除表,加入該到theme表和到theme_meta表。

它爲我提供了大約24行,每個匹配行的content表。

然後,我使用一些php foreach循環將結果重構爲每個content行的多維數組。

這樣高效嗎?打2個電話到數據庫會更快,更有效率,一個是content,另一個是theme。這將產生更少的行並且更容易處理,但需要第二次調用數據庫。

+2

您目前的方法(單個查詢)通常是最好的方法。數據庫查詢會產生很多開銷。 – eggyal

+0

更少的行?兩種方法都應該產生相同數量的行總數!?!?哦,什麼eggyal說+1 – Strawberry

回答

1

如上所述,使用單個查詢的方法通常是最好的方法(因爲數據庫查詢會產生大量開銷)。

事實上,聽起來好像您的替代方法會在每次調用某個其他查詢(在其他表上)的某個查詢(在content表上)的結果上循環以獲取連接的數據:這種方法將證明長期而言非常昂貴,並且不會很好地擴展。

因此,要從數據中組合一個多維數組,您只需要相應地對聯合結果進行排序,並在循環結果集時跟蹤上次看到的標識符(以檢測何時需要遍歷結果集所得陣列內的水平):

$qry = $dbh->query(' 
    SELECT * 
    FROM  content 
     JOIN rel  USING (contentID) 
     JOIN theme  USING (rel) 
     JOIN theme_meta USING (themeID) 
    ORDER BY contentID 
'); 

$arr = array(); 

$row = $qry->fetch(); 
while ($row) { 
    array_push($arr, array()); 
    $cid = $row['contentID']; 
    do { 
    array_push(end($arr), $row); 
    } while ($row = $qry->fetch() and $row['contentID'] == $cid); 
} 

echo var_export($arr); 

我然而提醒,它常常是不必要地昂貴從數據庫查詢的結果構建這樣的PHP的數據結構,如一個可以可能能夠建立和調度讀取結果集時必需的輸出。

+0

謝謝。非常翔實,我用非常相似的東西來管理它。 –