Php 正确使用notin子句
这里的场景是: 我有四张桌子Php 正确使用notin子句,php,mysql,sql,Php,Mysql,Sql,这里的场景是: 我有四张桌子 课程 学生 部门 注册课程 当学生要注册课程时,课程列表应该在课程表的下拉列表中。但已在“注册课程”表中的课程id不应加载到该课程下拉列表中。因为一个学生不能注册一门课2次。这里我使用的是notin操作,它将检索不在注册课程表中的课程id列表 但我在查询中遇到以下错误: 您的SQL语法有错误;检查手册 对应于要使用的正确语法的MariaDB服务器版本 第6行“注册课程。课程id限制0,25”附近 以下是查询: SELECT students.name, studen
课程
学生
部门
注册课程
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
,两者都相同又不相同?我没有从您建议的上述查询中获得任何数据。