【问题标题】:SQL - many to many - how to do it in one query?SQL - 多对多 - 如何在一个查询中完成?
【发布时间】:2013-03-11 04:25:36
【问题描述】:

如果我有一个像这样的数据库,有 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;

}

【问题讨论】:

    标签: php mysql sql join subquery


    【解决方案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'];
    }
    

    【讨论】:

      猜你喜欢
      • 2021-09-04
      • 2017-09-02
      • 1970-01-01
      • 2018-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-08
      相关资源
      最近更新 更多