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

如何在MySQL CodeIgniter中排除已匹配另一表的数据?

解决未提交成绩报表的SQL语法错误问题

问题分析

你当前的代码存在两个核心问题:

  1. 多余的左连接:左连接tbl_college_grades后会引入成绩表数据,和NOT EXISTS的筛选逻辑冲突,完全没必要添加
  2. NOT EXISTS写法错误:CodeIgniter的where()方法直接传入完整的NOT EXISTS字符串时,框架会自动做转义处理,导致MariaDB无法识别语法

修正方案

方案一:正确使用NOT EXISTS

去掉多余的左连接,直接在where()中写入正确的子查询逻辑:

function report(){
    // 筛选课程表中未在成绩表出现的记录
    $this->db->where('NOT EXISTS(SELECT 1 FROM tbl_college_grades WHERE tbl_college_grades.subCode = tbl_fm_college_curriculuminfo.subjectCode)');
    // 仅当课程表存在重复课程时才需要分组,否则可删除该行
    // $this->db->group_by('subject');
    $query = $this->db->get('tbl_fm_college_curriculuminfo');
    return $query->result_array();
}

子查询中用SELECT 1比选择具体字段更高效,且不会影响筛选逻辑。

方案二:使用WHERE NOT IN(更简洁)

先获取所有已提交成绩的课程编码,再筛选课程表中不在该列表的记录:

function report(){
    // 生成获取已提交课程编码的子查询SQL
    $submitted_codes = $this->db->select('subCode')->get_compiled_select('tbl_college_grades');
    // 筛选未提交成绩的课程
    $this->db->where_not_in('subjectCode', $submitted_codes);
    // 按需保留分组逻辑
    // $this->db->group_by('subject');
    $query = $this->db->get('tbl_fm_college_curriculuminfo');
    return $query->result_array();
}

这种写法逻辑更直观,也不容易出现语法错误。

补充说明

如果tbl_fm_college_curriculuminfo中不存在重复的课程记录,建议删除group_by('subject'),避免不必要的性能损耗。

内容的提问来源于stack exchange,提问作者Coder Codes

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 12:24:19