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

Laravel 8中MariaDB的NOT IN子查询无法运行,报错求助

问题解决:Laravel 8中MariaDB查询语句的语法错误修复

错误原因分析

你的Laravel代码存在两个关键问题,导致生成了错误的SQL语句:

  1. 原生SQL括号未闭合:DB::raw('student_id NOT IN (SELECT student_id FROM exclude_from_tracking_list') 末尾缺少闭合的),破坏了SQL语法结构。
  2. 错误使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 05:33:17