Laravel使用Query DB统计标签文章数时无文章标签不显示如何解决
问题原因
你当前的查询对tag_post表使用了内连接(INNER JOIN),内连接仅会返回两张表中同时满足关联条件的记录,没有关联任何文章的标签在tag_post表中没有对应匹配项,因此会被直接过滤,不会出现在结果集中。
修改方案
把对tag_post的内连接改为左连接(LEFT JOIN),同时可以优化冗余的子查询统计逻辑,修改后代码如下:
$query = DB::table('tags'); $query->join('users', 'users.id', '=', 'tags.user_creative_id'); // 将tag_post的内连接改为左连接,保留所有标签记录 $query->leftJoin('tag_post', 'tag_post.tag_id', '=', 'tags.id') ->select('tags.*', // 直接统计关联的文章关联记录,无关联时自动统计为0 DB::raw('COUNT(tag_post.id) as count_posts') ) ->orderBy('count_posts','desc') ->groupBy('tags.id');
改动说明
join('tag_post')替换为leftJoin('tag_post'):左连接会保留左表(tags表)的全量记录,哪怕右表tag_post没有匹配的关联记录,也不会过滤掉无文章的标签- 移除嵌套子查询改用
COUNT(tag_post.id)统计:左连接后无关联文章的标签对应的tag_post字段全为NULL,COUNT仅统计非NULL记录,因此无文章的标签count_posts会自动返回0,统计效率更高逻辑也更简洁。
内容的提问来源于stack exchange,提问作者Megatron
相关产品推荐
相关产品推荐

