多表Join关联统计第三表行数 无匹配数据仍返回空行问题解决
问题根因
异常来自SQL聚合函数的默认执行逻辑:你使用了COUNT()统计报名玩家数,但未配置分组规则。
- 无
GROUP BY时,整条查询会被作为单个聚合组执行计算:即使主表tournament没有任何符合筛选条件的记录,聚合函数仍会返回计算值(此处count(tournament_players.id)返回0),其余关联字段因无匹配数据全部返回null,最终生成1行无效数据。
修复方法
在查询逻辑中新增按主表主键的分组规则即可,修改后的CodeIgniter查询代码如下:
$getTournamentData = $this->db->select('tournament.*, tournament_meta.meta_title, tournament_meta.meta_description, categories.title AS category, categories.slug AS category_slug, games.game_name, games.slug AS game_slug, count(tournament_players.id) AS total_players'); $getTournamentData = $this->db->join('categories', 'categories.id = tournament.category_id'); $getTournamentData = $this->db->join('games', 'games.game_id = tournament.game_id'); $getTournamentData = $this->db->join('tournament_meta', 'tournament_meta.post_id = tournament.id'); $getTournamentData = $this->db->join('tournament_players', 'tournament_players.tournamentID = tournament.id', 'left'); // 新增按赛事主表ID分组 $getTournamentData = $this->db->group_by('tournament.id'); $dataCond['created_by'] = $this->session->userdata('user_id'); if($id != null) { $dataCond['tournament.id'] = $id; } $getTournamentData = $this->db->where($dataCond); $getTournamentData = $this->db->get('tournament');
逻辑说明
- 配置分组后,SQL会以每一条
tournament记录为维度执行聚合统计:当不存在符合条件的tournament记录时,没有可生成的分组单元,查询不会返回任何数据行,完全匹配业务预期。 tournament.id是主表主键,按该字段分组不会拆分单条赛事的关联数据,统计得到的total_players数值和原有逻辑一致,不会出现统计错误。
内容的提问来源于stack exchange,提问作者Usman Khan
相关产品推荐
相关产品推荐

