You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多表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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 09:27:09