即使未分配空间,SQL计数值也会返回0

时间:2013-02-19 10:26:00

标签: 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/#!2/5e1de/13

如果状态不是Pending,Failed,Declined,则会忽略房间,但可以在其他时段或天内免费但未预订 - 如果未预订则不会分配 - 这意味着day_id和period_id将不存在,但房间仍可免费预订。

似乎我需要重新输入我的SQL查询。关于如何做的任何建议?

3 个答案:

答案 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

希望这有帮助