数据库中的重复条目

时间:2012-10-26 11:35:48

标签: mysql codeigniter join left-join duplicate-data

仔细检查,如果我删除评论表加入,问题就解决了,但显然这不是理想的帮助!

我正在尝试使用Codeigniter撰写博客。目前我正在显示我想要显示的所有信息,但出于某种原因,在查看博客时,我有类别的重复内容。我的数据库中只有3个测试类别,但是我的所有3个测试帖子中有1个显示了6个而另一个只显示了一个类别两次。

甚至比这更奇怪,第一篇博客文章也在计算错误的评论数量。当数据库中只有4个并且只有两个与该帖子相关时,它显示6,但最奇怪的是第二个帖子显示正确的评论数量,两个。怎么可能。

这是来自相关模型的查询。

$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->join('posts_categories', 'posts_categories.blog_entry_id = posts.id', 'left outer', 'left outer');
    $this->db->join('categories', 'posts_categories.blog_category_id = categories.category_id', 'left outer');
    $this->db->join('comments', 'comments.post_id = posts.id', 'left outer' );

    $query = $this->db->get('posts', $config['per_page'], $this->uri->segment(3));

生成的标准查询是:

SELECT DISTINCT `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 
 FROM (`posts`) 
 LEFT OUTER JOIN `posts_categories` ON `posts_categories`.`blog_entry_id` = `posts`.`id` 
 LEFT JOIN `categories` ON `posts_categories`.`blog_category_id` = `categories`.`category_id` 
 LEFT JOIN `comments` ON `comments`.`post_id` = `posts`.`id` 
 GROUP BY `posts`.`id` LIMIT 1

可以找到数据库转储here

任何帮助都会非常感激,这让我发疯了!

干杯。

1 个答案:

答案 0 :(得分:0)

您是否有任何疑虑运行其他查询以获取评论计数?您可以执行以下查询(假设Active Record):

$this->db->where('parent_id', $post_id);
$this->db->count_all_results('comments');

但是,必须为每个帖子运行,因此您的查询数量为n + 1,其中n =帖子数。