2013-02-19 49 views
0

我有一個SQL查詢,它檢查名爲ts_allocation的表中的值以查看已分配的匹配空間(輔助條件)。如果他們是「分配」,那麼它不會返回結果。不幸的是,由於設計上的限制,我不能在我的桌子上有這種情況了。將SQL查詢從一個條件更改爲幾個

我現在想改變它,以便它看到房間的值是否等於「待定」,「失敗」或「拒絕」。如果是三者中的任何一個,那麼結果將被返回並且不被忽略(不像以前)。

一旦在第一個where子句中獲取了房間,系統需要檢查它們在ts_allocation表中是否爲「Pending」,「Failed」或「Declined」。一個房間可以預訂一定的日期或時間 - 但如果它的狀態仍然是「待定」,「失敗」或「拒絕」,則可以查看它。其他任何事情都意味着房間被預訂了。

我希望我做的意義在這裏......這裏是我到目前爲止的代碼:

SELECT 
    COUNT(*) totalCount 
FROM 
    ts_room rm 
WHERE building_id=:building_id AND 
    NOT EXISTS (
    SELECT 1 
    FROM ts_roompref rp 
     JOIN ts_request rq 
     ON rp.request_id = rq.id 
     AND day_id = 4 
     AND period_id = ".$i." 
    WHERE 
     rm.id = rp.room_id) 
AND NOT EXISTS (
    SELECT 1 
    FROM ts_roompref rp 
     JOIN ts_allocation a 
     ON rp.request_id = a.request_id 
     AND a.status = 'Allocated' 
    WHERE 
     rm.id = rp.room_id) 
+0

至少提供'ts_room','ts_roompref'和'ts_allocation'表的關鍵列表列表 – Tahbaza 2013-02-19 02:05:50

+0

http://sqlfiddle.com/#!2/e1021/6 – methuselah 2013-02-19 02:15:46

回答

1

我假設你想要的房間的鑰匙早在查詢的結果...

SELECT DISTINCT rm.Id as RoomId 
FROM ts_room rm LEFT JOIN ts_roompref rp ON rp.room_id = rm.id 
    LEFT JOIN ts_request rq ON rq.id = rp.request_id 
    LEFT JOIN ts_allocation a ON a.request_id = rq.id 
WHERE building_id = :building_id 
    AND (a.status IS NULL OR a.status IN ('Pending', 'Failed', 'Declined'))