Laravel 查询生成器:添加另一个联接会导致错误的计数结果
Laravel Query Builder: adding another join causes the wrong count result
我有一个查询,在我不使用特定联接时 returns 得到了正确的结果。但是当我添加另一个连接时,计数显示完全不同的结果。我不明白为什么会这样。
这是我的查询:
$query = DB::table('contentable_tips')
->join('content', 'contentable_tips.content_id', '=', 'content.id')
->join('users', 'content.author_id', '=', 'users.id')
->join('contentable_subcategories', 'content.parent_id', '=', 'contentable_subcategories.content_id')
->join('content as subcategory', 'contentable_subcategories.content_id', '=', 'subcategory.id')
->join('content as category', 'subcategory.parent_id', '=', 'category.id')
->join('content as comment_content', 'contentable_tips.content_id', '=', 'comment_content.parent_id')
->join('contentable_comments', 'comment_content.id', '=', 'contentable_comments.content_id')
->groupBy('contentable_tips.content_id');
$query = $query->select(
'category.slug as parent_slug',
'content.id',
'contentable_tips.title',
'contentable_tips.name',
'contentable_tips.likes_count',
'contentable_tips.content',
'contentable_subcategories.content_id',
'contentable_subcategories.title as subject',
'content.author_id',
'users.public as author_public',
'users.name as author_name',
DB::raw('count(contentable_comments.id) as comment_count'),
)
->groupBy('contentable_subcategories.id')
->orderBy('likes_count', 'desc')
->limit($limit)
->get();
但是当我添加这个连接时:
->join('content_likes', function ($join) {
$join->on('content_likes.content_id', '=', 'contentable_tips.content_id')
->where('content_likes.created_at', '>=', now()->subMonth());
})
评论数从 20 变为 800。这显然不正确,我也在我的数据库中检查过。我想根据上个月的点赞数添加 likes_count。我还删除了 contentable_tips.likes_count
上的 select,因为当我从 content_likes
table 获得点赞数时,它不再需要了。这就是我添加此特定连接的原因。
我已经尝试在 content_likes
之前加入 content
table,但没有成功。我只是不明白为什么添加所有这些连接没有问题,但是当我添加这个连接时它突然显示错误的结果。
如果需要更多信息,我会提供。
我设法找到了解决方案。我添加了一个原始查询,我根据 created_at 日期计算点赞数:
->leftJoin(DB::raw('(SELECT content_id, count(id) as likes FROM content_likes WHERE created_at >= now() - interval 1 month group by content_id) as content_likes'),'content_likes.content_id', '=', 'contentable_tips.content_id')
我有一个查询,在我不使用特定联接时 returns 得到了正确的结果。但是当我添加另一个连接时,计数显示完全不同的结果。我不明白为什么会这样。
这是我的查询:
$query = DB::table('contentable_tips')
->join('content', 'contentable_tips.content_id', '=', 'content.id')
->join('users', 'content.author_id', '=', 'users.id')
->join('contentable_subcategories', 'content.parent_id', '=', 'contentable_subcategories.content_id')
->join('content as subcategory', 'contentable_subcategories.content_id', '=', 'subcategory.id')
->join('content as category', 'subcategory.parent_id', '=', 'category.id')
->join('content as comment_content', 'contentable_tips.content_id', '=', 'comment_content.parent_id')
->join('contentable_comments', 'comment_content.id', '=', 'contentable_comments.content_id')
->groupBy('contentable_tips.content_id');
$query = $query->select(
'category.slug as parent_slug',
'content.id',
'contentable_tips.title',
'contentable_tips.name',
'contentable_tips.likes_count',
'contentable_tips.content',
'contentable_subcategories.content_id',
'contentable_subcategories.title as subject',
'content.author_id',
'users.public as author_public',
'users.name as author_name',
DB::raw('count(contentable_comments.id) as comment_count'),
)
->groupBy('contentable_subcategories.id')
->orderBy('likes_count', 'desc')
->limit($limit)
->get();
但是当我添加这个连接时:
->join('content_likes', function ($join) {
$join->on('content_likes.content_id', '=', 'contentable_tips.content_id')
->where('content_likes.created_at', '>=', now()->subMonth());
})
评论数从 20 变为 800。这显然不正确,我也在我的数据库中检查过。我想根据上个月的点赞数添加 likes_count。我还删除了 contentable_tips.likes_count
上的 select,因为当我从 content_likes
table 获得点赞数时,它不再需要了。这就是我添加此特定连接的原因。
我已经尝试在 content_likes
之前加入 content
table,但没有成功。我只是不明白为什么添加所有这些连接没有问题,但是当我添加这个连接时它突然显示错误的结果。
如果需要更多信息,我会提供。
我设法找到了解决方案。我添加了一个原始查询,我根据 created_at 日期计算点赞数:
->leftJoin(DB::raw('(SELECT content_id, count(id) as likes FROM content_likes WHERE created_at >= now() - interval 1 month group by content_id) as content_likes'),'content_likes.content_id', '=', 'contentable_tips.content_id')