1

このような 3 つのテーブルを持つデータベースがある場合:

Table: BlogEntries
BlogEntries.id (pk)
BlogEntries.blogText

Table: Tags
Tags.id (pk)
Tags.TagName

Table: TagsForBlogEntries
TagsForBlogEntries.id (pk)
TagsForBlogEntries.tag_id
TagsForBlogEntries.entry_id

ブログエントリのリストを取得し、次のようなデータを取得したい場合 (配列として表現):

array (
[0] => array(
    [id] => '1',
    [blogText] => 'example text',
    [tags] => array(
      array([id]=>1, [TagName] => 'A Test Tag 1'),
      array([id]=>2, [TagName] => 'A Test Tag 2'),

    )
),

(つまり、すべてのタグを使用)。これを行う最良の方法は何ですか?

私は現在これを行います(疑似コード)-基本的にサブクエリを「手動で」実行します(元のSQLクエリからではありません):

select * from BlogEntries;
$rows =array();
foreach($blogEntries as $row) {

   $row['tags'] = mysql_fetch_array( mysql_query("select * from Tags left join TagsForBlogEntries on TagsForBlogEntries.tag_id = tags.id where entry_id = " . $row['id'] ) ) ;
   $rows[] = $row;

}
4

1 に答える 1

1

いくつかの方法があります。1 つは、ブログ投稿でグループ化することです。

SELECT be.id, blogText, GROUP_CONCAT(TagName) AS tags
FROM BlogEntries be JOIN TagsForBlogEntries tbe ON (be.id = tbe.entry_id)
JOIN Tags ON (tbe.tag_id = Tags.id)
GROUP BY be.id

各行を反復処理する場合、tags列をコンマで分割できます (またはSEPARATORGROUP_CONCAT.

2 番目は上記と似ていますが、自分で集計を行います。いいえGROUP BY

while ($row = $result->fetch()) {
    if (!isset($blogs[$row['id']]) {
        $blogs[$row['id']] = array(
            'text' => $row['blogText'],
            'tags' => array()
        );
    }
    $blogs[$row['id']]['tags'] = $row['TagName'];
}
于 2013-03-11T04:30:48.637 に答える