【问题标题】:get records of past two months excluding today's record list获取过去两个月的记录,不包括今天的记录列表
【发布时间】: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


【解决方案1】:

您想将当前日期的条件从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;

【讨论】:

  • 结果仍然没有区别。
  • @RK。 . . .这不应该返回任何今天签到的警卫。 advised_sign_in 上是否有时间组件?如果是这样,你想要having sum(date(shifts. advised_sign_in) = CURDATE() ) = 0
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-03
相关资源
最近更新 更多