2014-09-03 25 views
-1

我有以下数据库的例子:从3个表,其是由映射表连接的MySQL获取数据

database scheme

的例子是相当多的不言自明的:有在定义的时间段由教师保持课(time_start,time_end)每个时间段 - >课程连接都有自己的max_students数字。

我知道想列出所有课程的3个表格(和max_students)的所有信息。我会那样做(我听说,像,加入表是最快的方法):

SELECT * FROM lesson, teacher, time, teacher_has_lesson, time_has_lesson 
WHERE lesson.lesson_id = teacher_has_lesson.lesson_lesson_id 
AND teacher.teacher_id = teacher_has_lesson.teacher_teacher_id 
AND lesson.lesson_id = time_has_lesson.lesson_lesson_id 
AND time.time_id = time_has_lesson.time_time_id 

1)这是一个很好的解决方案,如果你只是想加入3个表或有更好的呢?

2.)这个SQL调用只会让我有课,有老师和时间。我还想显示数据库中的课程,但没有老师或时间。我怎样才能做到这一点?

回答

1

还有一种使用join语法编写这种方法的替代方法。你有什么是相当于inner join,在那里你只能看到那里有匹配行:

select 
    * 
from 
    lesson l 
     inner join 
    teacher_has_lesson tl 
     on l.lession_id = tl.lesson_lesson_id 
     inner join 
    teacher t 
     on tl.teacher_teacher_id = t.teacher_d 
     inner join 
    time_has_lesson tml 
     on l.lesson_id = tml.lesson_lesson_id 
     inner join 
    time tm 
     on tml.time_time_id = tm.time_ud 

还有另外一个类型的连接称为outer join,所有从一个表中的行显示,并提供空值,如果有在另一个表中没有匹配的值。它有两个或三个变种。 left outer join显示第一个表中的所有行。 right outer join显示第二个表中的所有行。 full outer join显示来自两个表的所有行。因此,您可以使用以下第二个查询:

select 
    * 
from 
    lesson l 
     left outer join 
    teacher_has_lesson tl 
     on l.lession_id = tl.lesson_lesson_id 
     left outer join 
    teacher t 
     on tl.teacher_teacher_id = t.teacher_d 
     left outer join 
    time_has_lesson tml 
     on l.lesson_id = tml.lesson_lesson_id 
     left outer join 
    time tm 
     on tml.time_time_id = tm.time_ud