我想查询一下:
选择以下合同:
- 活跃,
- 现在使用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}}
相同的空集
答案 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' )
)
这种方式对我来说更具可读性和可维护性。