Laravel 8中MariaDB的NOT IN子查询无法运行,报错求助
问题解决:Laravel 8中MariaDB查询语句的语法错误修复
错误原因分析
你的Laravel代码存在两个关键问题,导致生成了错误的SQL语句:
- 原生SQL括号未闭合:
DB::raw('student_id NOT IN (SELECT student_id FROM exclude_from_tracking_list')末尾缺少闭合的),破坏了SQL语法结构。 - 错误使用
where()方法:当你向where()传入DB::raw作为唯一参数时,Laravel会将该语句识别为字段名,自动拼接is null进行判断,这就是错误日志中出现is null的原因。你需要使用whereRaw()来直接执行原生WHERE条件,避免框架的自动处理。
正确实现方式
方式一:使用whereRaw贴近原生SQL
这种写法直接对应你的原始MariaDB查询,保持语法一致性:
DB::table('registrations') ->selectRaw('student_id, last_name, first_name, COUNT(id) as courses') ->whereRaw('student_id NOT IN (SELECT student_id FROM exclude_from_tracking_list)') ->groupBy('student_id') ->havingRaw('COUNT(*) > 3') ->orderBy('last_name') ->get();
方式二:使用Laravel查询构造器的whereNotIn + 子查询
这是更符合Laravel风格的写法,利用框架的查询构造器封装子查询:
DB::table('registrations') ->selectRaw('student_id, last_name, first_name, COUNT(id) as courses') ->whereNotIn('student_id', function($query) { $query->select('student_id')->from('exclude_from_tracking_list'); }) ->groupBy('student_id') ->havingRaw('COUNT(*) > 3') ->orderBy('last_name') ->get();
额外说明
两种写法最终生成的SQL语句与你原始的可运行MariaDB查询一致,都能正确排除exclude_from_tracking_list表中的学生,统计选课数超过3门的学生信息并按姓氏排序。
内容的提问来源于stack exchange,提问作者Jimmy
相关产品推荐
相关产品推荐

