如何在MySQL CodeIgniter中排除已匹配另一表的数据?
解决未提交成绩报表的SQL语法错误问题
问题分析
你当前的代码存在两个核心问题:
- 多余的左连接:左连接
tbl_college_grades后会引入成绩表数据,和NOT EXISTS的筛选逻辑冲突,完全没必要添加 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
相关产品推荐
相关产品推荐

