2013-01-08 40 views
1

我有兩個表,一個主表,一個支持主表,非常非常類似於WordPress的帖子和posts_meta。合併元表與主表

主表:

ID 標題, 內容

id | title  | content 
1 | one  | content one 
2 | two  | content two 

元表:

ID ITEM_ID 鍵 值

id | item_id | key  | value 
1 | 1   | template | single 
2 | 1   | group  | top 
1 | 2   | template | page 
2 | 2   | group  | bottom 

最後,我的目標是將數據從主表中取出,並與元表合併。例如:

$data = array(
    array(
     'id' => 1, 
     'title' => 'one', 
     'content' => 'content one', 
     'template' => 'single', 
     'group' => 'top' 
    ), 
    array(
     'id' => 2, 
     'title' => 'two', 
     'content' => 'content two', 
     'template' => 'page', 
     'group' => 'bottom' 
    ) 
); 

什麼是最好的方式來實現這種方式,預成型好?

我正在使用PDO連接到我的數據庫,以及我現在如何做,我首先查詢第一個表上的數據,然後對於每個結果,我查詢元表,我使用這個準備好的語句,因爲它被認爲是快速的,但即便如此,它也損害了我的劇本的表現。

謝謝

回答

1

相反查詢元表從第一個查詢每個結果

你應該提取的第一個結果對IDS:

$rows = q('SELECT * FROM posts'); 
$byIds = []; 
foreach ($rows as &$row) 
{ 
    $byIds[$row['id']] =& $row; 
} 

和運行第二個查詢:

$rows2 = q('SELECT * FROM posts_meta WHERE item_id IN (' . implode(',', array_keys($byIds)) . ')'); 

然後在PHP中循環結果並與第一個查詢re合併sults。

foreach ($rows2 as $row2) 
{ 
    $byIds[$row2['item_id']][$row2['key']] = $row2['value']; 
} 

你必須現在$行變量您的合併結果:

var_dump($rows); 

這樣你就只有2分貝請求。

請注意,我已經使用$ byIds作爲引用數組,所以我不必在第二個循環中搜索具有特定id的行。 $行中元素的這種順序被保留。

+0

這聽起來像一個很好的solutuion,你會怎麼建議我合併?我現在有一個與元數據數組,並不能想到一個有效的方式合併,謝謝 – johnsardine

+0

花費的答案。你可以使用引用來加速。 – fsw

+0

謝謝你的時間和幫助,這工作完美 – johnsardine