我有两个表:区域和预订
zones
-----
id:int
name:varchar
slots:int
reservations
------------
zone:int
timestamp:long
我需要让所有区域都有活动预订的数量(时间戳小于reftimestamp的预订不应该算作活动)。
修改 确定使用此查询,我得到了更好的结果:
SELECT z.name, count(r.timestamp)
FROM zonas AS z
LEFT JOIN reservations AS r
ON z.id = r.zona
WHERE r.timestamp > $refTimestamp
GROUP BY z.id
但我希望获得所有区域。即使在另一个表上没有保留,它也应该返回计数为零(0)的区域(r.timestamp)
我该怎么做?
答案 0 :(得分:1)
我认为你需要的是:
SELECT z.name,
sum(case when r.timestamp is null then 0
when r.timestamp > $refTimestamp then 1
else 0 end)
FROM zonas AS z
LEFT JOIN reservations AS r
ON z.id = r.zona
GROUP BY z.id
这将为您提供所有区域。
答案 1 :(得分:0)
使用
SELECT z.*, count(r.*)
FROM zonas AS z
LEFT JOIN reservations AS r
ON z.id = r.zona
AND r.timestamp > $reftimestamp
GROUP BY z.id
如您所见,我已将WHERE
条件移至LEFT JOIN ... ON
。在您的情况下,数据库首先执行左连接 - 没有保留的行具有NULL
作为其时间戳,因此他们无法通过WHERE
条件(因为NULL > whatever
是假)。
查看类似的小提琴 - http://sqlfiddle.com/#!9/124cc7/5