我的SQL查询再次出现问题......
D.0.02已分配给第1天的第1期,因此它应该计为0.但是它没有被分配到第1天的时间段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
如果状态不是Pending,Failed,Declined,则会忽略房间,但可以在其他时段或天内免费但未预订 - 如果未预订则不会分配 - 这意味着day_id和period_id将不存在,但房间仍可免费预订。
似乎我需要重新输入我的SQL查询。关于如何做的任何建议?
答案 0 :(得分: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
)以返回空闲时段数。
答案 1 :(得分:0)
会议室D.0.02
的状态为"Allocated"
。
a.status IN ('Pending', 'Failed', 'Declined')
= false
a.status IS NULL
= false
声明WHERE
的结果变为false
。
找不到房间。
答案 2 :(得分:0)
问题是你的dayId和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
希望这有帮助