2013-02-15 67 views
2

請忍受我,因爲我的SQL不太好。跨越三張表的SQL查詢

我想編寫一個查詢,考慮來自3個不同表格的信息。

讓我解釋一下情況:當客戶預訂一個房間時,他們會偏好幾個房間,並且可以在不同的時間預訂房間(每天只能預訂一次)。

我現在想編寫一個查詢來檢查一天中某個時間段的房間是否可用。這些都是我的數據庫中的表我有

房間

此表存儲每個房間

Fields: 

id (primary key) 
capacity  
img 
notes 
building_id 
roomstructure_id  
lecturestyle_id 

要求

此表存儲每個請求消息作出

信息
Fields 

id (primary key) 
day_id 
period_id 
preference_id (foreign key from preference.id) 

此表存儲有關每個請求的信息。

偏好

此表存儲所有的房間喜好信息。

id (PK)  
request_id (foreign key from request.id)  
room_id (foreign key from room.id) 

我希望我所做的事情變得明顯。

舉例來說,如果我檢查房間是否是C233週一09:00預訂 - 我需要查找房間信息在房間表,然後使用ROOM_ID偏好表查找request_id

一旦我有REQUEST_ID已經鏈接到特定的房間(在房間偏好表)我可以看到無論是在請求表day_id = 1和period_id = 1。如果day_id = 1且period_id = 1,則表示該房間在週一09:00點預訂。

這意味着房間不可用,因此不計算在內,但如果找不到這一行,則會計算在內。

這是我到目前爲止已經寫的SQL - 它很簡單,但它不會做一切我想做的事情:在另一個

SELECT COUNT(*) totalCount FROM ts_room 

除了這個,我一直在獻計論壇 - 這裏的代碼。但它根本不起作用。我不認爲它符合我的標準:

SELECT COUNT(*) totalCount 
FROM room a 
     INNER JOIN preference b 
      ON a.id = b.room_id 
     INNER JOIN ts_request c 
      ON b.request_id = c.preference_id 
WHERE c.day_id = 1 AND c.period_id = 1 

在此先感謝!

+0

查詢未選擇特定房間(例如C233),但總體結構似乎正確。當你說它不在al工作時,你的意思是什麼? – 2013-02-15 20:20:52

+0

@Darius,爲什麼查詢不選擇特定的房間?我正在與這個項目的奧馬爾 - 我們已經測試了代碼,並注意到返回 – methuselah 2013-02-15 20:49:59

+0

所以你的意思是返回0,或返回NULL,或....?它應該返回一個整數,即使沒有找到適合您的條件的房間 – Melanie 2013-02-15 22:09:09

回答

0

好的,你發佈的代碼接近正確,但有幾個問題。首先,請求表的姓名不一致。在您的描述中,您只需將其稱爲'請求',但在代碼中則爲'ts_request'。儘管你的問題可能只是一個錯字。

另一個問題是您的第二個INNER JOIN中的鍵(首選項和請求之間)是混在一起的。你有b.request_id = c.preference_id。 IE:你試圖將兩個外鍵匹配起來,而不是用它們代表的主鍵。您只需要一個主/外鍵進行連接。所以這應該工作(未測試):

SELECT COUNT(*) totalCount 
FROM room a 
     INNER JOIN preference b 
      ON a.id = b.room_id 
     INNER JOIN request c 
      ON b.request_id = c.id 
WHERE c.day_id = 1 AND c.period_id = 1 

(我不使用完全非描述性標識,A,B和C的粉絲,但它是有效的代碼我個人至少使用RM, rq,pf或其他可識別的東西,或者甚至只是堅持使用表名稱,因爲它們相當短)

有一點需要注意的是,從請求和首選項表中有兩個方向的外鍵意味着每個請求只有一個首選項。 (如果請求表中的preference_id字段可以保留爲空/空,則可能爲零)。如果您希望可以爲每個請求提交多個首選項,那麼應刪除該preference_id外鍵列,因爲它不是獨特的價值。上述查詢也不是必需的,但如果確實每個請求確實存在一個首選項的限制,那麼顯然可能將其包含在其他地方。

編輯:正如您對問題的評論中所述,此查詢也不會查找特定房間,而是返回爲第1天第1期預留的房間總數。如果您想要特定房間,你還必須在你的WHERE子句中添加「AND a.id =」。