2013-02-19 50 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