我有两个问题:
以下查询返回给我今天工作的警卫详细信息:
一:
SELECT
`guards`.`surname`
, `contracted_guard`.`con_id`
, `guards`.`street`
, `shifts`.`advised_sign_in`
FROM
`guards`
LEFT JOIN `contracted_guard` ON `contracted_guard`.`guard_id` = `guards`.`gid`
LEFT JOIN `shifts` ON `shifts`.`guard_id` = `guards`.`gid`
WHERE advised_sign_in >=CURDATE()
AND advised_sign_in < CURDATE()+ INTERVAL 1 DAY
GROUP BY `guards`.`gid`
ORDER BY `guards`.`given_names` ASC
LIMIT 400
现在,以下第二个查询返回了我今天没有工作但在过去两个月至少登录过一次的警卫详细信息(这是因为获取活动警卫列表,因为系统包含一个巨大的警卫列表)
查询二:
SELECT
`guards`.`surname`
, `contracted_guard`.`con_id`
, `guards`.`street`
, `shifts`.`advised_sign_in`
FROM
`guards`
LEFT JOIN `contracted_guard`
ON (`contracted_guard`.`guard_id` = `guards`.`gid`)
LEFT JOIN `shifts`
ON (`shifts`.`guard_id` = `guards`.`gid`)
WHERE (`shifts`. advised_sign_in !=CURDATE() AND advised_sign_in >= DATE_SUB(CURDATE(), INTERVAL 2 MONTH))
GROUP BY `guards`.`gid`
ORDER BY `guards`.`given_names` ASC;
这两个查询都运行正常。但问题是第二次查询返回那些今天也在工作但也有旧日期的警卫的结果(这是因为他们也在过去两个月内签了名)。虽然我想要一份警卫名单,但不包括那些今天工作但过去两个月工作的警卫。
任何提示都将受到高度赞赏。
答案 0 :(得分:0)
您希望将当前日期的条件从where
移动到having
子句:
SELECT `guards`.`surname`, `contracted_guard`.`con_id`, `guards`.`street`, `shifts`.`advised_sign_in`
FROM `guards`
LEFT JOIN `contracted_guard`
ON (`contracted_guard`.`guard_id` = `guards`.`gid`)
LEFT JOIN `shifts`
ON (`shifts`.`guard_id` = `guards`.`gid`)
WHERE advised_sign_in >= DATE_SUB(CURDATE(), INTERVAL 2 MONTH))
GROUP BY `guards`.`gid`
HAVING sum(`shifts`. advised_sign_in = CURDATE() ) = 0
ORDER BY `guards`.`given_names` ASC;