【发布时间】:2014-09-19 02:14:37
【问题描述】:
我有两个疑问:
以下查询返回我今天工作的警卫详细信息:
一个:
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;
这两个查询都可以正常工作。但问题是第二个查询返回了那些今天也在工作但日期旧的警卫的结果(这是因为他们在过去两个月也已经登录)。虽然我想要的警卫名单不包括那些今天工作但在过去两个月内工作过的警卫。
任何提示将不胜感激。
【问题讨论】:
-
尝试
SELECT ... , max(`shifts`.`advised_sign_in`) as `last_sign_in` FROM ...获取每个guard的最近登录时间,并替换WHERE clause中的相应标识符。GROUP BY查询如果不使用“累积函数”(sum()、count()、max()、min...)就没有多大用处。
标签: mysql sql codeigniter join left-join