2014-12-22 58 views
-2

下表形成一個關係數據庫管理系統維護的數據庫的一部分: -從表中加入數據MySQL的

Hotel (hotelNo, hotelName, city) 
Room (roomNo, hotelNo, type, price) 
Booking (hotelNo, guestNo, dateFrom, dateTo, roomNo) 
Guest (guestNo, guestName, guestAddress) 

,其中包含酒店酒店的細節和hotelNo是主鍵; 房間包含每個酒店的房間詳細信息,並且(房間號,酒店號)構成主鍵; 預訂包含預訂的詳細信息和(hotelNo,guestNo,dateFrom)形成主要的 密鑰;客人包含客人的詳細信息,guestNo是主鍵。

如果我想請選擇所有居住在倫敦的客人的姓名和地址,我需要使用何種類型的連接?從邏輯的角度來看,我有一個理論,我必須通過所有表格工作,而不僅僅是包含'guestName','guestAddress'和'city'的表格,但是如何在單個查詢中做到這一點令人困惑我。

+0

這只是一個3路'Hotel','Booking'和'Guest'表之間的內部連接。這個'Room'表不需要這個。 – Barmar

+0

@JohnRuddell我從來沒有使用過這種類型的數據庫,因此,儘管有幾次谷歌搜索,但我確實沒有合適的開始。 –

+0

聽起來像一個功課問題? – programnub112

回答

0

無論何時您有一個威脅您的查詢並需要多個表格,最好將它分解成幾部分並將它們拼接在一起。

例如,你的要求第一部分:

選擇的名稱和所有來賓的地址..

您可以通過編寫一個查詢來做到這一點開始。這是一個簡單的選擇聲明:

SELECT g.guestName, g.guestAddress 
FROM guest g; 

接下來,你需要找到住在倫敦的客人。不幸的是,我們無法直接跳到Hotel表,因爲它沒有提及Guest。然而,Booking與這兩者相關,所以我們可以在guestNo列匹配的條件下加入預訂表,然後加入酒店表,條件是hotelNo匹配。最後,添加一個條件,該酒店在倫敦:

SELECT g.guestName, g.guestAddress 
FROM guest g 
JOIN booking b ON b.guestNo = g.guestNo 
JOIN hotel h ON h.hotelNo = b.hotelNo AND h.city= 'London'; 

什麼這個查詢不就是防止其中一個客人已經住在一家酒店一次以上的情況。看來,在這種情況下,你希望誰是目前住在倫敦的客人,這樣你就可以添加其他條件dateTo是或今天的日期後的日期,就像這樣:

SELECT g.guestName, g.guestAddress 
FROM guest g 
JOIN booking b ON b.guestNo = g.guestNo AND b.dateTo >= CURDATE(); 
JOIN hotel h ON h.hotelNo = b.hotelNo AND h.city= 'London';