从表中选择*,其中date =本周和?

时间:2017-05-29 10:10:18

标签: php mysql

我有一个使用Monaca / Onsen UI和AngularJS构建的跨平台企业应用程序,允许用户提交他们在一周内使用的机器的每周报告。检查包括各种安全检查,例如机器上的当前时间,安全装置等。

该应用程序的这一部分工作正常,用户可以通过专用平板电脑和智能手机提交每周报告。

每周报告数据被发送到SQL数据库,我有一个使用Laravel框架在Sximo Builder上构建并在AWS上托管的CMS。管理员用户使用提交的报告数据来查看报告并确保每周提交所有机构的所有报告。

我需要一个查询,管理员用户可以快速过滤所有为任何给定周数提交 NO 报告的机器。

但由于我的表格仅包含已提交的报告,如何检查哪些机器尚未提交?

我提交的报告的表格如下所示,带有一些虚拟数据。

列: ID,NAME,MACHINE ID,HOURS,SUBMITTED,DATE,WEEK NO ,值 175,Jane Doe,H93,2600,True,03/05/2017 15: 36,21

我还有一个机械表,如下图所示,只保存机械细节。

列: ID,机器ID,制作,模型,值为1,H93,理光,H1254

如何在报告 NOT 提交的任何特定周内向管理员用户显示机器列表。

1 个答案:

答案 0 :(得分:1)

您可以使用机器将报告表连接到表格 并加入机器ID和周数 如果没有匹配,则报告ID将为空。

例如:

一些测试数据:

drop table if exists machineryreport;
create table machineryreport (ID int, NAME varchar(30), `MACHINE ID` varchar(4), HOURS int, SUBMITTED BOOLEAN, `DATE` date, `WEEK NO` int);
insert into machineryreport (ID, NAME, `MACHINE ID`, HOURS, SUBMITTED, `DATE`, `WEEK NO`) values
(175, 'John Doe', 'H92', 2600, True, '2017-03-05 15:36', 21),
(176, 'Jane Doe', 'H93', 2700, True, '2017-03-05 15:38', 21),
(177, 'Jake Doe', 'H95', 2900, True, '2017-03-06 15:42', 21);

drop table if exists machinery;
create table machinery (ID int, `MACHINE ID` varchar(4), MAKE varchar(30), MODEL varchar(8));
insert into machinery (ID, `MACHINE ID`, MAKE, MODEL) values
(1,'H92','Alderado','H1254'),
(2,'H93','Ricoh','H1254'),
(3,'H94','Consuela','H1254'),
(4,'H95','Josep','H1254');

使用LEFT JOIN:

select m.* 
from machinery m
left join machineryreport r 
  on (m.`MACHINE ID` = r.`MACHINE ID` and
      r.`WEEK NO` = 21)
where r.ID is null;

或者在子查询中使用NOT IN:

select * 
from machinery 
where `MACHINE ID` not in (
    select distinct `MACHINE ID` 
    from machineryreport 
    where `WEEK NO` = 21
);

或使用NOT EXISTS:

select * 
from machinery m
where not exists (
    select 1
    from machineryreport r
    where m.`MACHINE ID` = r.`MACHINE ID` 
      and r.`WEEK NO` = 21
);

返回:

ID MACHINE ID MAKE     MODEL
-- ---------- ----     -----
3  H94        Consuela H1254