0

2 つのリレーショナル テーブルを取得しました。

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

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

「カテゴリ」テーブルを選択した場合、すべてのカテゴリ (「SELECT * カテゴリ」のように) を含む PHP 配列を取得したいと思いますが、すべての投稿を含む内部配列を含めます。

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

非効率だと思うので、複数のクエリを作成したくありません。

1つのクエリで希望の結果を達成する方法はありますか?

私は CakePHP がリレーショナル テーブルの結果をこの形式で返すことができることを知っているので、同じ結果を達成しようとしています。

4

2 に答える 2

0

まず、この機能が必要な場合は、既に解決されている問題に対して独自のコードを展開するのではなく、ORM ライブラリ (CakePHP や他のフレームワークが提供するものなど) を使用することを検討してください。

SQL で '内部配列' を実行することはできませんが、非常に醜い (レコードを文字列列にパックしてから PHP でアンパックするなど) ことは避けられません。

しかし、手っ取り早い解決策として、カテゴリ ID との混同を避けるために、クエリ内の投稿 ID とタイトル (「post_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']);
}

このコードはエディターで書いていないので、タイプミスをお詫びします。大まかな考え方はわかります。

于 2012-07-11T23:28:26.277 に答える
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
于 2012-07-11T21:50:49.580 に答える