我有一个系统,其中一个用户是一系列“运行”的一部分,每个“运行”,可以添加课程,教师(用户),类等。
每位教师(用户)都选择了他/她的班级和班级。课程。 这是我所掌握的相关表格的缩减:
lam_run - The run in it self.
lam_run_course - Relational table that shows what runs has what courses
lam_teacher_course - Relational table that shows which teacher has which courses
lam_run_teacher - Relational table that shows what teachers are in what courses
我想要做的是向每位教师展示与他们相关的课程(根据他们在lam_teacher_course中选择的课程),但他们尚未参与。
这是我到目前为止无法运行的MySQL代码:
$query_relevant_runs = "
SELECT DISTINCT
lam_run_course.run_id
FROM
lam_teacher_course,
lam_run_course,
lam_run, lam_run_teacher
WHERE
lam_teacher_course.user_id = '1'
AND
lam_teacher_course.course_id = lam_run_course.course_id
AND
lam_run_teacher.user_id != '1'";
相反,此代码显示所有相关的运行,但不排除用户已经在的运行..
我该怎么做才能解决这个问题?
聚苯乙烯。抱歉标题不好,不知道我应该叫什么:S
以下是部分数据库(相关部分)的链接:Link!
答案 0 :(得分:1)
我认为您正在寻找的是:
LEFT JOIN `lam_run_teacher` `lam_run_teach_exclude`
ON `lam_run_teacher_exclude`.`user_id` = `lam_teacher_user`.`user_id`
...
WHERE `lam_run_teacher`.`user_id` IS NULL
LEFT JOIN接受当前查询,并将附加数据附加到其中。但是,与您现在使用的INNER JOIN不同(使用有点奇怪的多重语法),LEFT JOIN不会将结果集限制为只有右侧有数据的结果集。右侧列将为NULL。通过对该NULL进行过滤,您可以找到所有有趣的运行,并且与教师之间没有关系。
这有帮助吗?
我建议始终使用普通的连接语法(INNER JOIN target on target.id = source.id
) - 这样你就会更加意识到还有其他类型的连接,并且所有连接看起来都是一样的。这需要一些时间来习惯,但是当你的查询变得更复杂时肯定会有所帮助。
此外,在交叉引用表中,您可以删除主键列。如果表的唯一目的是定义两个表之间的链接,则使主键由您获得的两个键组成。除非您希望能够多次将同一位老师与一位老师联系起来......
好的,花了我的时间比它应该的更长,但这是完整的事情:
SELECT DISTINCT `lam_run_course`.run_id FROM `lam_run_course` INNER JOIN `lam_teacher_course` ON `lam_teacher_course`.course_id = `lam_teacher_course`.course_id LEFT JOIN `lam_run_teacher` ON (`lam_run_teacher`.`run_id` = `lam_run_course`.`run_id` AND `lam_run_teacher`.`user_id` = 3) WHERE `lam_teacher_course`.user_id = 3 and `lam_run_teacher`.`run_id` IS NULL