我的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/#!2013年2月5日
如果状态不是"挂起"、"失败"或"拒绝",则忽略房间,但它可能在其他时段或天数内是空闲的,但没有预订-如果没有预订,则没有分配-这意味着day_id和period_id将不存在,但房间仍然可以自由预订。
我似乎需要重新键入SQL查询。有什么建议吗?
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
)以返回空闲时段数。
房间D.0.02
的状态为"Allocated"
。
a.status IN ('Pending', 'Failed', 'Declined')
=错误
a.status IS NULL
=错误
语句WHERE
的结果变为false
。
找不到任何房间。
问题是您的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
希望这能帮助