即使未分配房间,SQL计数值仍返回0

  • 本文关键字:返回 SQL 分配 房间 php mysql
  • 更新时间 :
  • 英文 :


我的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

希望这能帮助

最新更新