左连接复杂的where子句

时间:2017-01-13 16:34:21

标签: sql left-join

我有两个表:区域和预订

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)

我该怎么做?

2 个答案:

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

这将为您提供所有区域。

在此处查看:http://sqlfiddle.com/#!9/6c37e8/1

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