Php 正确使用notin子句

Php 正确使用notin子句,php,mysql,sql,Php,Mysql,Sql,这里的场景是: 我有四张桌子 课程 学生 部门 注册课程 当学生要注册课程时,课程列表应该在课程表的下拉列表中。但已在“注册课程”表中的课程id不应加载到该课程下拉列表中。因为一个学生不能注册一门课2次。这里我使用的是notin操作,它将检索不在注册课程表中的课程id列表 但我在查询中遇到以下错误: 您的SQL语法有错误;检查手册 对应于要使用的正确语法的MariaDB服务器版本 第6行“注册课程。课程id限制0,25”附近 以下是查询: SELECT students.name, studen

这里的场景是:

我有四张桌子

  • 课程
  • 学生
  • 部门
  • 注册课程
  • 当学生要注册课程时,课程列表应该在课程表的下拉列表中。但已在“注册课程”表中的课程id不应加载到该课程下拉列表中。因为一个学生不能注册一门课2次。这里我使用的是
    notin
    操作,它将检索不在注册课程表中的课程id列表

    但我在查询中遇到以下错误:

    您的SQL语法有错误;检查手册 对应于要使用的正确语法的MariaDB服务器版本 第6行“注册课程。课程id限制0,25”附近

    以下是查询:

    SELECT students.name, students.email,departments.name as d_name,
            courses.name as c_name
            FROM students JOIN departments on students.department_id=departments.id 
            JOIN courses on departments.id = courses.department_id
            LEFT JOIN enroll_courses on enroll_courses.course_id=courses.id 
            WHERE courses.id NOT IN (enroll_courses.course_id) AND students.id=8
    
    有谁能帮我找到解决办法吗?

    试试这个

    SELECT  students.name ,
            students.email ,
            departments.name AS d_name ,
            courses.name AS c_name
    FROM    students
            JOIN departments ON students.department_id = departments.id
            JOIN courses ON departments.id = courses.department_id
            JOIN enroll_courses ON enroll_courses.course_id = courses.id
    WHERE   students.id = 8
            AND courses.id NOT IN ( enroll_courses.course_id );
    
    试着这样,

    SELECT  students.name ,
            students.email ,
            departments.name AS d_name ,
            courses.name AS c_name
    FROM    students
            JOIN departments ON students.department_id = departments.id
            JOIN courses ON departments.id = courses.department_id
            JOIN enroll_courses ON enroll_courses.course_id = courses.id
    WHERE   students.id = 8
            AND courses.id NOT IN ( enroll_courses.course_id );
    

    有几种方法可以获得所需的结果,这与原始查询非常接近:

    SELECT  students.name ,
            students.email ,
            departments.name AS d_name ,
            courses.name AS c_name
    FROM    students
    JOIN departments
      ON students.department_id = departments.id
    JOIN courses
      ON departments.id = courses.department_id
    WHERE students.id = 8   
    -- up to here it's all possible courses
    
    -- now remove already enrolled courses
      AND courses.id NOT IN  
       (
         SELECT course_id
         FROM enroll_courses
         WHERE student_id = 8
       )
    
    或相关版本:

      AND courses.id NOT IN  
       (
         SELECT course_id
         FROM enroll_courses
         WHERE student_id = students.student_id
       )
    
    或不存在:

      AND NOT EXISTS 
       (
         SELECT *
         FROM enroll_courses
         WHERE student_id = students.student_id
           AND course_id = courses.course_id
       )
    

    有几种方法可以获得所需的结果,这与原始查询非常接近:

    SELECT  students.name ,
            students.email ,
            departments.name AS d_name ,
            courses.name AS c_name
    FROM    students
    JOIN departments
      ON students.department_id = departments.id
    JOIN courses
      ON departments.id = courses.department_id
    WHERE students.id = 8   
    -- up to here it's all possible courses
    
    -- now remove already enrolled courses
      AND courses.id NOT IN  
       (
         SELECT course_id
         FROM enroll_courses
         WHERE student_id = 8
       )
    
    或相关版本:

      AND courses.id NOT IN  
       (
         SELECT course_id
         FROM enroll_courses
         WHERE student_id = students.student_id
       )
    
    或不存在:

      AND NOT EXISTS 
       (
         SELECT *
         FROM enroll_courses
         WHERE student_id = students.student_id
           AND course_id = courses.course_id
       )
    

    NOT IN(enroll\u courses.course\u id)应该是这样添加一些示例表数据和预期结果。也许您希望
    不在(子查询)
    中。
    注册课程表的DDL是多少?应该有两列,
    课程id
    学生id
    。是的,你是对的。有两列,第一列。学生证2。课程id不在(enroll\u courses.Course\u id)应该是这样添加一些示例表数据和预期结果。也许您希望
    不在(子查询)
    中。
    注册课程表的DDL是多少?应该有两列,
    课程id
    学生id
    。是的,你是对的。有两列,第一列。学生证2。课程id这应该如何工作,您加入
    注册课程。课程id=courses.id
    ,然后检查
    课程。id不在(enroll\u courses.course\u id
    ,两者都相同又不相同?我没有从您建议的上述查询中获得任何数据。这是怎么回事,您加入
    enroll\u courses.course\u id=courses.id
    ,然后检查
    courses.id不在(注册课程。课程id
    ,两者都相同又不相同?我没有从您建议的上述查询中获得任何数据。