【发布时间】:2014-05-27 13:20:56
【问题描述】:
我有一个名为 jobs 的表,其中包含以下字段:id、status。还有一个名为 jobs_history 的表,其中包含以下字段:id、jobid、status、added_time。
每次通过 php 编辑作业时,我都会将更新后的数据插入到 jobs_history 表中,其中包含 jobid、用户选择状态和 added_time。
一个工作可能被多次编辑,因此jobs_history 表中可能有很多行用于一个工作。并且状态字段可能包含不同的状态,例如,第一个状态是“审核中”,第二个可能是“进行中”,第三个可能是“已发送电子邮件”,第四个是“已完成”。
现在,我需要计算特定日期时间在该日期处于“进行中”状态的作业总数。以下是 jobs_history 表中的一些示例数据:
id | jobid | status | added_time
--------------------------------------
1 | 10 | Under review | 2014-05-20 01:00:00
2 | 10 | In progress | 2014-05-21 02:30:00
3 | 10 | E-mail sent | 2014-05-23 10:00:00
4 | 10 | Completed | 2014-05-23 04:00:00
5 | 11 | Under review | 2014-05-19 05:00:00
6 | 11 | In progress | 2014-05-20 06:00:00
7 | 11 | E-mail sent | 2014-05-20 07:00:00
8 | 11 | Completed | 2014-05-22 08:00:00
9 | 12 | Under review | 2014-05-23 09:00:00
10 | 12 | In progress | 2014-05-24 02:00:00
11 | 13 | Under review | 2014-05-20 10:00:00
12 | 13 | In progress | 2014-05-20 12:00:00
我想计算 2014 年 5 月 21 日 06:00:00 状态为“进行中”的作业总数。查询应生成结果 2,即 jobid 10 和 13,因为它们是唯一在 2014 年 5 月 21 日 06:00:00 具有最后状态“进行中”的作业。
jobs_history 表中有大约 400,000 条数据,因此应该以尽可能快的方式编写查询。
谢谢,非常感谢您在这方面的帮助。
【问题讨论】:
-
尝试 SELECT COUNT(*) AS Count FROM jobs_history WHERE status = 'In progress' AND added_time = '2014-05-21 06:00:00'
-
@Saqueib - 问题在于没有行匹配给定的
added_time条件。该表表示给定作业何时发生某些更改的日志,因此查询应该查找给定时间点的状态,即使当时没有条目。 -
好吧,我需要的查询不会那么简单。正如我所说,查询应该产生 2 的结果,即 jobid 10 和 13。因为这些是在 2014-05-21 06:00:00 之前具有最后状态“进行中”的唯一作业。它也不会计算jobid 11,因为它的最后状态是“E-mail sent”,同样,jobid 12 也不会计算在内,因为它在2014-05-21 06:00:00 之后的状态是“In progress”。我能够编写所有常规查询,但真的很困惑如何编写这个。 @Saqueib