2012-07-11 42 views
0

我得到了2的關係表:排序SQL JOIN導致PHP數組

table "categories" 
id int(11) 
title varchar(255) 

table "posts" 
id int(11) 
title varhcar(255) 
category_id int(11) // foreign key 

如果我選擇「類別」表,我想獲得一個PHP數組與人的類別(如「SELECT *類別「),但包括內部陣列,它的所有帖子:

Array (
    /* first category */ 
    [0] = Array (
     [id] => 1 
     [title] => "Rock" 
     /* all its posts */ 
     [posts] => Array (
      [0] = Array(
       [id] = 100 
       [title] = "Rock post title" 
       [category_id] = 1 
      ) 
      [1] = Array(
       [id] = 101 
       [title] = "Other rock post title" 
       [category_id] = 1 
      ) 
    ) 
    /* second category */ 
    [1] = Array (
    ) 
/* ... */ 
) 

如果我只是做了一個‘加入’查詢我得到的所有結果相結合,是這樣的:

id  title id title    category_id 
1  Rock  100 "Rock post title" 1 
2  Rock  101 "Other rock post" 1 
3  Rock  102 "Final rock post" 1 

我不想做多個查詢,因爲我認爲效率低下。

有無論如何實現一個查詢的願望結果嗎?

我知道CakePHP管理以這種格式返回關係表結果,所以我期望達到相同的結果。

+0

連接查詢很好,你只需要循環遍歷結果來創建你想要的數組結構。 – 2012-07-11 21:42:46

回答

0

的加入應該是這個樣子:

select c.id, c.title, p.id, p.title, p.category_id 
from categories c, posts p 
where c.id = p.category_id 
order by c.id, p.id 
0

首先,如果你想要這個功能,可以考慮使用ORM庫(比如什麼CakePHP的和其他框架提供),而不是滾動您自己的代碼,這是一個問題已經解決了。

你不能在SQL中做'內部數組',而不是沒有很大的醜陋(就像把記錄打包成字符串列,然後用PHP解壓縮它們一樣)。

但是對於快速的骯髒解決方案,只要在查詢中重命名帖子ID和標題(例如'post_id'),就可以使用原始聯接查詢,以避免與類別ID混淆。然後遍歷結果集並構建您的數組。

$newArray = array(); 
foreach($resultset as $row) { 
    if(!array_key_exists($row['category_id'],$newArray)) { 
     $newArray[$row['category_id']] = array('id' => $row['category_id'], 'title' => $row['title'], 'posts' => array()); 
    } 
    $newArray[$row['category_id']]['posts'] = array('id' => $row['post_id'], 'title' => $row['post_title'], 'category_id' => $row['category_id']); 
} 

我沒有在編輯器中編寫這段代碼,所以我對錯別字表示歉意。你得到了一般想法。