LEFT OUTER JOIN,按日期过滤

时间:2013-12-31 14:13:10

标签: mysql left-join outer-join

我想查询一下:
选择以下合同:
- 活跃,
- 现在使用start_date,
- 现在使用end_date,
AND,
- 没有与租金相匹配的记录。

请注意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( {出租{1}} {月{1}} 相同的空集

1 个答案:

答案 0 :(得分:3)

此条件过滤所有非零匹配的租金

AND DATE_FORMAT( `Rent`.`month` , '%Y-%m' ) <> DATE_FORMAT( NOW( ) , '%Y-%m' )

虽然此条件过滤了租金的所有空匹配

AND `Rent`.`id` IS NULL

第一个条件似乎不符合您的任何初始要求,基本上如下: - 没有与租金相匹配的记录。

我将尝试从where子句中删除第一个条件。

评论后编辑: 我更喜欢编写不匹配条件的方法是以这种方式使用exists运算符:

SELECT `Contract`.*
FROM `contracts` AS `Contract`
WHERE 
Contract`.`active` = 1
AND `Contract`.`end_date` > NOW( )
AND `Contract`.`start_date` < NOW( )
AND NOT EXISTS (
  SELECT * FROM `rents` AS `Rent` 
  WHERE
  `Rent`.`contract_id` = `Contract`.`id` 
  AND DATE_FORMAT( `Rent`.`month` , '%Y-%m' ) <> DATE_FORMAT( NOW( ) , '%Y-%m' )
)

这种方式对我来说更具可读性和可维护性。