2014-09-03 57 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