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

有几种方法。一种是按博文分组:

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.

第二个将与上述类似,但您自己进行聚合。没有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 回答