0

我的 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 查询。关于如何做的任何建议?

4

3 回答 3

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) 以返回空闲时段的数量。

于 2013-02-19T10:31:22.590 回答
0

房间的状态D.0.02"Allocated"

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

a.status IS NULL=假

语句的结果WHERE变为false

没有找到房间。

于 2013-02-19T10:42:55.513 回答
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

希望这可以帮助

于 2013-02-19T11:00:48.377 回答