2013-02-19 51 views
0

我在與我的一次SQL查詢的問題...SQL計數值返回0,即使沒有被分配房間

D.0.02已分配1天時間爲1,所以應該算0.但它尚未分配給第一天2.爲什麼它返回爲0?

SELECT COUNT(DISTINCT rm.Id) 
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 room_id = "D.0.02" 
    AND (a.status IS NULL OR a.status IN ('Pending', 'Failed', 'Declined')) 
    AND (day_id=1 AND period_id=2) 

這裏是我的小提琴:http://sqlfiddle.com/#!2/5e1de/13

如果狀態不是未決的,失敗的,衰落的房間被忽略,但它可能是免費爲其他期間或數天,但沒有預訂 - 如果不預訂那麼它沒有被分配 - 這意味着day_id和period_id將不存在,但房間仍然可以自由預訂。

這似乎是我需要重新鍵入我的SQL查詢。有關如何的建議?

+0

除了不正確的狀態條款,我的理解是所需的結果集應該返回1點,記錄即。使用子句<<(day_id = 1 AND period_id = 2)>>這兩個條件必須爲真,但是「D.0。02分配給第1天期間1「,所以我認爲子句應該是」AND(rq.day_id = 1 AND rq.period_id IN(1,2))>>。你應該澄清/發佈預期/期望的結果集,對於特定的房間得到分配和/或要求在特定的日期/期間。希望這可以幫助至少澄清你想從這個查詢什麼。 – 2013-02-19 11:09:34

+0

你可以請示例在SQLFiddle – methuselah 2013-02-19 11:15:22

+0

剛剛編輯你的示例 - 但請注意我忽略了狀態條款對我不清楚,請根據需要編輯http://sqlfiddle.com/#!2/5e1de/140 – 2013-02-19 11:22:43

回答

2

Count()總是即使沒有行匹配也會返回一個數字。 在你的情況下,沒有行匹配,所以count()返回0

編輯:預訂的

你的選擇數量進行計數。 0意味着它未被預訂。

如果你想返回1時,它是未記錄你需要扭轉這種局面:

SELECT 1 - COUNT(DISTINCT rm.Id) 
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 room_id = "D.0.02" 
    AND a.status = 'Allocated' 
     AND day_id=1 AND period_id=2 

請注意,如果你犯了一個更廣泛的搜索,例如在一天的所有時間,你需要改變1到期數(9)返回空閒插槽的數量。

+0

我認爲我需要重新修改我的SQL,但在過去的一個小時內一直在爭奪它。我可以通過任何方式來改變這一點,以便它確認如果D.0.02在第1天期間1被預訂了,那麼它應該計爲0,但是如果它沒有被預訂,它應該在期間2計數爲1 – methuselah 2013-02-19 10:33:32

+0

請參閱我的答案中的編輯。 – 2013-02-19 11:33:41

+0

我已經在這裏測試過了 - http://sqlfiddle.com/#!2/8851c/12。對於D.0.02,似乎仍然返回1,即使它是在第1天期間1中預訂的。 – methuselah 2013-02-19 11:44:27

0

房間D.0.02的狀態是"Allocated"

a.status IN ('Pending', 'Failed', 'Declined') =假

a.status IS NULL =假

聲明WHERE的結果成爲false

找不到房間。

+0

是的我明白,但它是僅分配給第1天期間1。如果它沒有被分配到第1天的第2階段,那麼它應該返回爲true,但我不知道如何執行此操作。你做? – methuselah 2013-02-19 10:45:26

0

的問題是,你的大衛·和period_id是VARCHAR且將其作爲比較數字

更新查詢的最後一行,並添加記錄爲day_id和period_id這樣就可以得到結果。

AND (day_id like "1" AND period_id like "2") 

更新

select 1- count(distinct rp.Id) from 
ts_roompref rp, ts_request rq, ts_allocation ta 
where rp.room_id= "D.0.02" AND rq.id = rp.request_id and 
ta.request_id = rq.id AND ta.status not in ("Pending", "Declined", "Failed") 
AND day_id like "1" AND period_id like "5"; 

檢查 http://sqlfiddle.com/#!2/5e1de/187

希望這有助於

+0

在某些情況下,day_id和period_id不可用,因爲只有在請求房間時纔會添加它們。我也想把這個邏輯融入到我的搜索中。因此,它會查找它不存在的位置,並查看它存在的位置 - 它存在的位置會檢查分配狀態您是否也可以重新上傳SQL提琴 – methuselah 2013-02-19 11:03:57

+0

@methuselah更新了小提琴。 – Meherzad 2013-02-19 11:37:34

+0

它似乎工作正常,但我檢查期間3,4,5,6,7,8,9和第1,2,3,4,5天(可能的值),但它仍然返回0 – methuselah 2013-02-19 11:40:49