向我的查询添加另一个数据库连接导致看不到某些行

Posted

技术标签:

【中文标题】向我的查询添加另一个数据库连接导致看不到某些行【英文标题】:Adding another database join to my query is causing some rows not to be seen 【发布时间】:2012-04-13 14:17:45 【问题描述】:

对了,这个我不是特别熟练,这其实是我第一次join查询,所以要温柔。我将提供尽可能多的细节,因为它可能会像煎锅一样击中你们大多数人的脸,但它正在让我疯狂!

我在查询我尝试在 codeigniter 中编写的博客时遇到问题。我已经为帖子设置了一个包含 2 个连接的查询,它是使用三个表的类别:帖子、类别和 posts_categories 现在我也在尝试加入我的 cmets 表来进行计数。

这是我的模型中的代码,它显示了我编写的两个通用帖子:

            $this->db->select('posts.id,
                            posts.title,
                            posts.slug,
                            posts.content,
                            posts.author,
                            posts.date,
                            posts.time,
                            posts.tags,
                            posts.status,
                            GROUP_CONCAT(categories.name SEPARATOR \'-\') AS categories
                            ');
        $this->db->group_by(array('posts.id'));
        $this->db->from('posts');
        $this->db->join('posts_categories', 'posts_categories.blog_entry_id = posts.id');
        $this->db->join('categories', 'posts_categories.blog_category_id = categories.category_id');
        $query = $this->db->get();
        return $query->result_array();

这是结果:

(
[0] => Array
    (
        [id] => 1
        [title] => My first blog post!
        [slug] => my-first-blog-post
        [content] => This is my first blog post. Don't worry, it's just a test, my real blog won't be this boring, hopefully!
        [author] => Joni
        [date] => 2012-01-23
        [time] => 00:00:00
        [tags] => Testing
        [status] => 
        [categories] => Testing-More Tests-Test
    )

[1] => Array
    (
        [id] => 2
        [title] => This is another test-post
        [slug] => this-is-another-test-post
        [content] => Well you guessed it. another boring test post, enjoy!
        [author] => Joni
        [date] => 2012-01-23
        [time] => 00:00:00
        [tags] => Sexy
        [status] => 
        [categories] => Test
    )

)

现在,当我修改查询以实现 cmets 的第三个连接时,如下所示:

            $this->db->select('posts.id,
                            posts.title,
                            posts.slug,
                            posts.content,
                            posts.author,
                            posts.date,
                            posts.time,
                            posts.tags,
                            posts.status,
                            GROUP_CONCAT(categories.name SEPARATOR \'-\') AS categories,
                            count(comments.id) as total_comments
                            ');
        $this->db->group_by(array('posts.id'));
        $this->db->from('posts');
        $this->db->join('posts_categories', 'posts_categories.blog_entry_id = posts.id');
        $this->db->join('categories', 'posts_categories.blog_category_id = categories.category_id');
        $this->db->join('comments', 'comments.post_id = posts.id');
        $query = $this->db->get();
        return $query->result_array();

我最终得到了这个

(
[0] => Array
    (
        [id] => 1
        [title] => My first blog post!
        [slug] => my-first-blog-post
        [content] => This is my first blog post. Don't worry, it's just a test, my real blog won't be this boring, hopefully!
        [author] => Joni
        [date] => 2012-01-23
        [time] => 00:00:00
        [tags] => Testing
        [status] => 
        [categories] => Testing-More Tests-Test
        [total_comments] => 3
    )

)

如果你已经做到了这一步,对不起,拖了这么久,只是想提前说声谢谢!

干杯乔尼

【问题讨论】:

有什么问题?哪一行没有看到? 如果您的第二个帖子没有评论,则不会显示。这就是您的底部结果中发生的情况。 【参考方案1】:

您需要使用 LEFT OUTER JOIN 否则您只会收到包含 cmets 的帖子。当您执行 INNER JOIN(默认)时,它将要求左侧的任何内容在联接的右侧都有匹配的元素。如果在右侧找不到匹配项,则将其省略。 LEFT OUTER JOIN 将保留连接左侧的所有元素,无论右侧是否存在匹配项。

改变这个:

$this->db->join('comments', 'comments.post_id = posts.id'); 

$this->db->join('comments', 'comments.post_id = posts.id', 'left outer' );

【讨论】:

+1。我正要打字。我在 cmets 部分向她解释了为什么她的帖子没有出现。 是的,它已经排序,非常感谢大家。告诉过你这对你们其他人来说是小菜一碟!【参考方案2】:

->join 是做什么的?如果它正在进行内部连接,您的问题可能是它会排除没有任何 cmets 的帖子。您需要在那里使用左外连接来确保包含没有 cmets 的帖子。

【讨论】:

【参考方案3】:

通过快速查看您的查询,我假设您的第二个帖子没有任何 cmets,并且当您尝试在 cmets 上进行连接时,它不会收到第二个帖子。

【讨论】:

以上是关于向我的查询添加另一个数据库连接导致看不到某些行的主要内容,如果未能解决你的问题,请参考以下文章

SQL Left Join 仅第一个匹配项

如何使用交叉连接优化 SQL 查询

如何始终为某些 django 模型使用特定的数据库连接?

Datastudio BigQuery 连接器:查询返回错误

Django:如何根据来自行的数据和来自另一个模型的数据将聚合字段添加到查询集中?

无法向我的项目添加另一个窗口[重复]