2015-07-20 35 views
2

MySQL表图:我想进一步下降进入查询,但不知道如何

enter image description here

我查询这个地步:

SELECT tblcourses.CourseStandard, 
       tblcourses.CourseID, 
       tblcourses.CourseRef, 
       tblcourses.CourseStandard, 
       tblcourses.CourseName, 
       tblcourses.CourseDuration, 
       tblcourses.NQFLevel, 
       tblcourses.CoursePrice, 
       tblcoursestartdates.StartDate 
    FROM etcgroup.tblcoursestartdates tblcoursestartdates 
     INNER JOIN etcgroup.tblcourses tblcourses 
      ON (tblcoursestartdates.CourseID = tblcourses.CourseID) 
WHERE tblcoursestartdates.StartDate >= Now() 

如果你看看图,你会看到我有第三张桌子。上面的查询工作正常。它显示所有数据,因为它应该。

我想显示所有课程及其各自的日期,不包括那些学生已预订的课程。请记住,一门课程可以有20个开课日期。这就是为什么我只选择日期> =现在()。

我想确保学生没有得到双重预订。是的,我可以在之后做。哔哔的学生已经预订了,但是如果我现在能够显示课程日期,那么这个学生已经预订了很好。有什么建议么?

+0

你为什么要使用DISTINCT?你想压制每个课程是否有重复的开课日期? –

+0

对不起。我在玩的时候忘了那里。它不需要在那里。 –

+0

而任务是,你想要上面的查询,但只为一个学生X还没有预定的课程? –

回答

1

这很简单。想必你知道你想看到的StudentID。对预订表执行左连接并选择不匹配。

 SELECT tblcourses.CourseStandard, 
      tblcourses.CourseID, 
      tblcourses.CourseRef, 
      tblcourses.CourseStandard, 
      tblcourses.CourseName, 
      tblcourses.CourseDuration, 
      tblcourses.NQFLevel, 
      tblcourses.CoursePrice, 
      tblcoursestartdates.StartDate 
     FROM etcgroup.tblcoursestartdates tblcoursestartdates 
INNER JOIN etcgroup.tblcourses tblcourses 
       ON tblcoursestartdates.CourseID = tblcourses.CourseID 
      AND tblcoursestartdates.StartDate >= Now() 
    LEFT JOIN tblbookings 
       ON tblbookings.CourseId = tblcourses.CourseId 
      AND tblbookings.StudentId = <<<the student ID in question >>> 
     WHERE tblbookings.BookingID IS NULL 

这里的技巧是LEFT JOIN ... IS NULL模式。它在消除了行中LEFT JOIN的ON条件命中,只留下错过的那些行。

+0

非常好。谢谢。 –

1

做一个左加入到courseID上的tblBookings,其中bookingIDnull(没有匹配)。您必须提供studentID作为查询的参数。

SELECT DISTINCT c.CourseStandard, 
       c.CourseID, 
       c.CourseRef, 
       c.CourseStandard, 
       c.CourseName, 
       c.CourseDuration, 
       c.NQFLevel, 
       c.CoursePrice, 
       d.StartDate 
FROM etcgroup.tblcoursestartdates d 
INNER JOIN etcgroup.tblcourses c ON d.CourseID = c.CourseID 
LEFT JOIN etcgroup.tblBookings b on c.CourseID = b.CourseID and b.StudentID = @StudentID 
WHERE d.StartDate >= Now() and b.bookingID is null 
0

使用NOT EXISTS或NOT IN找到一个学生已经预订了课程:

SELECT 
    c.CourseStandard, 
    c.CourseID, 
    c.CourseRef, 
    c.CourseStandard, 
    c.CourseName, 
    c.CourseDuration, 
    c.NQFLevel, 
    c.CoursePrice, 
    csd.StartDate 
FROM etcgroup.tblcourses c 
INNER JOIN etcgroup.tblcoursestartdates csd ON csd.CourseID = tblcourses.CourseID 
WHERE csd.StartDate >= Now() 
AND c.CourseID NOT IN 
(
    SELECT CourseID 
    FROM tblbookings 
    WHERE StudentID = 12345 
); 
相关问题