SQL查询2个表,其中值不在给定日期范围内

时间:2017-08-25 10:13:50

标签: javascript php mysql database select

我在SQL数据库中有2个表。

第一个表 - 设备 - 包含公司中使用的机器记录清单。以下是 Equipment 表的列名。

id | assetnumber | 制作 |的 模型

其中:

  • id =行唯一ID
  • assetnumber =机器的唯一编号,例如ABC123
  • 类型 - 机械制造
  • 模型 - 机械模型

对于每件机器,操作员必须完成每周一次的安全检查。每个提交的报告都会输入第二个表格 - 报告

Reports 表的设置如下。

id | userid | assetnumber | 问题 | 周数 |的 datesubmitted

其中:

  • id =行唯一ID
  • userid =机器的运营商ID
  • assetnumber =机器的唯一编号,例如ABC123(匹配设备 assetnumber
  • 周数 - 报告完成的周数
  • 提交日期 - 报告完成的日期/时间

我需要让管理员用户输入周数,例如33然后查询 Reports 表以返回所有机器的 assetnumber 列表,其中没有为查询的周数提交该机器的报告。这将用于确保每周完成报告以符合安全标准。

我正在从网页中捕获周数以传递给SQL查询,但我不知道如何查询2个表以返回所需的数据。

我在尝试:

SELECT Equipment.assetnumber, Reports.assetnumber, Reports.weeknumber FROM Reports JOIN Reports ON Reports.assetnumber = Equipment.assetnumber WHERE Reports.weeknumber IS NULL

但我不认为我走在正确的轨道上。 如何找到使用SQL交叉引用我的2个表的所有设备的列表?

我还考虑创建一个读取两个表的JavaScript文件,将它们存储为单独的数组,然后循环遍历数组以查看值不匹配的位置 - 但显然这比单个SQL查询效率低。

1 个答案:

答案 0 :(得分:2)

有几种方法可以做到这一点

首先,类似于您的尝试,您可以使用左连接,左连接保留左表(设备)上的所有行并使用"其中"获取右表没有数据的行(Reports)。

SELECT e.assetnumber
FROM Equipment e
  LEFT JOIN Reports r ON r.assetnumber = e.assetnumber AND r.weeknumber = 33
WHERE r.datesubmitted is NULL

这是另一种方式,更简单:

SELECT e.assetnumber
FROM Equipment e
WHERE e.assetnumber NOT IN
  (SELECT assetnumber FROM Reports WHERE weeknumber = 33)