【发布时间】:2013-12-31 14:13:10
【问题描述】:
我想查询这个:
选择以下合同:
- 活跃,
- 现在开始日期之前,
- 现在结束日期为 AFTER,
并且,
- 没有匹配的租金记录。
请注意,Rent.month 是日期数据类型列,内容格式为“yyyy-mm-dd”。
如果这个条件被删除,我得到正确的记录。
使用这个查询我得到一个空的结果集
SELECT `Contract`.*
FROM `contracts` AS `Contract`
LEFT JOIN `rents` AS `Rent` ON ( `Rent`.`contract_id` = `Contract`.`id` )
WHERE
Contract`.`active` = 1
AND `Contract`.`end_date` > NOW( )
AND `Contract`.`start_date` < NOW( )
AND DATE_FORMAT( `Rent`.`month` , '%Y-%m' ) <> DATE_FORMAT( NOW( ) , '%Y-%m' )
AND `Rent`.`id` IS NULL
我做错了什么?
编辑
我也试过
AND DATE_FORMAT(Rent.month, '%Y-%m' ) = DATE_FORMAT( NOW( ) , '%Y-%m' )
同一个空集
【问题讨论】:
-
你想要这部分 'AND DATE_FORMAT(
Rent.month, '%Y-%m') DATE_FORMAT(NOW(), '%Y-%m')'连接谓词不是 where? -
在
WHERE子句中对Rent.month的测试消除了所有Rent.month为空的记录,隐式地将您的外部联接变为内部联接。您必须在连接条件内执行该测试(或者将OR Rent.month IS NULL添加到WHERE子句,使用括号来应用正确的优先级)。
标签: mysql left-join outer-join