【问题标题】:MYSQL Join puzzle: inner and left join at the same timeMYSQL Join之谜:同时inner和left join
【发布时间】:2012-09-10 17:20:28
【问题描述】:

我有以下表格:

Schools
Teachers
Courses
XRefSchoolsTeachers
XRefCoursesTeachers

现在我正在尝试获取提供该课程的大学所有教师的名单,这些教师不教授该课程。到目前为止,我有:

SELECT *
FROM Courses
INNER JOIN XRefSchoolsTeachers
    ON Courses.SchoolID = XRefSchoolsTeachers.SchoolID

这给了我提供该课程的学校所有教师的 ID,但现在我需要删除所有与 XRefCoursesTeachers 中该课程 ID 不相符的教师 ID。我查看了another question here 关于如何删除不在另一个列表中的内容,我需要一个左连接。但我觉得我也需要一个内部加入,这样我才能得到那所学校的老师,他们已经不在名单上>

例如

SELECT *
FROM Courses
INNER JOIN XRefSchoolsTeachers
    ON Courses.SchoolID = XRefSchoolsTeachers.SchoolID
LEFT JOIN XRefCoursesTeachers
    ON (XRefCoursesTeachers.TeacherID = XRefSchoolsTeachers.TeacherID
     AND XRefCoursesTeachers.CourseID = Courses.ID)
WHERE Courses.ID = ? AND XRefSchoolsTeachers.TeacherID IS NULL

会给我任何其他学校的任何其他课程的所有老师 - 这不是我想要的。我想要所有可以教这门课程但不能教的老师。

就像我需要在XRefCourseTeachers.CourseID = Courses.ID 上进行内部联接,然后使用TeacherIDXRefCourseTeachers 的同一实例上进行左联接,这样我就可以挑选出NULL 结果。但我不知道该怎么做。

这怎么可能?我是否采取了正确的方法?

【问题讨论】:

  • 您好像少了一张桌子 - CoursesSchools?
  • 不完全。事实证明,每门课程只能在一所学校教授,因此Courses 表包含SchoolID 列。拥有那个额外的表格可能是更好的设计,但现在它只是一个列。
  • 无需重新发布与 Clodoaldo 给出的相同解决方案。相反,您应该投票并接受他的解决方案
  • @sami 实际上他的解决方案不起作用,并且与我发布的不一样。请查看我在他的问题上发表的评论。

标签: mysql join


【解决方案1】:
SELECT *
FROM Courses
INNER JOIN XRefSchoolsTeachers
    ON Courses.SchoolID = XRefSchoolsTeachers.SchoolID
left join XRefCoursesTeachers
    on XRefCoursesTeachers.TeacherID = XRefSchoolsTeachers.TeacherID
where 
    XRefCoursesTeachers.TeacherID is null
    and
    Cousers.ID = ?

SELECT *
FROM Courses
INNER JOIN XRefSchoolsTeachers
    ON Courses.SchoolID = XRefSchoolsTeachers.SchoolID
where 
    XRefCoursesTeachers.TeacherID not in (
        select TeacherID
        from XRefCoursesTeachers
        where XRefCoursesTeachers.CourseID = Courses.ID
    )
    and
    Courses.ID = ?

【讨论】:

  • 当然!!~我忘了内连接也可以在WHERE子句中完成:D谢谢
  • 仔细观察,你的第一个表达基本上就是我在问题中所说的,它不起作用
【解决方案2】:

找到解决方案:

SELECT *
FROM Courses
INNER JOIN XRefSchoolsTeachers
    ON Courses.SchoolID = XRefSchoolsTeachers.SchoolID
LEFT JOIN XRefCoursesTeachers
    ON (XRefCoursesTeachers.TeacherID = XRefSchoolsTeachers.TeacherID AND XRefCoursesTeachers.CourseID = Courses.ID)
WHERE 
        XRefCoursesTeachers.TeacherID IS NULL
    AND
        Cousers.ID = ?

【讨论】:

    猜你喜欢
    • 2018-07-10
    • 2016-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-29
    • 2019-09-03
    • 2012-08-17
    • 2014-03-11
    相关资源
    最近更新 更多