谁没有昨天报道? mysql不在列表中

时间:2014-09-16 19:55:05

标签: mysql list notin

我有一个医院列表(FacilityID_UUID),每天必须提交数据(date = create_date)。

在某一天,我想确定哪一天没有报告。

从此开始:

SELECT `FacilityID_UUID`
FROM `TEST`
where `FacilityID_UUID` not in (
  SELECT distinct `FacilityID_UUID`
  FROM `TEST`
  where `Create_Date` = '2014-09-16'
)

(将用sysdate替换日期,或间隔1天)

但是,我有两个问题:

1-太慢了!现在跑了30分钟,我预计不会超过20个结果)。我怎样才能让它更快?

2-它只向我提供过去至少提交过一次的医院名称,但不是昨天。如果更多的医院在周三开始提交,我希望周四的询问能够接受。基本上,我想说“给我列表X的医院,这些医院昨天没有提交”,并自己写清单X.

任何想法

2 个答案:

答案 0 :(得分:0)

您可以执行LEFT JOIN以获取已报告或未报告此日期的每个测试,然后在第二个表上仅保留空值,以仅查看在指定日期未报告的测试。

SELECT FacilityID_UUID
FROM TEST
LEFT JOIN TEST AS REPORT_DATE_TEST ON TEST.FacilityID_UUID = REPORT_DATE_TEST.FacilityID_UUID
AND REPORT_DATE_TEST.Create_Date = '2014-09-16
WHERE REPORT_DATE_TEST.FacilityID_UUID IS NULL;

上一个查询将提供与查询相同的结果,但速度更快。

但我怀疑你可能希望每个UUID只有一行,在这种情况下它会是

SELECT DISTINCT FacilityID_UUID
FROM TEST
LEFT JOIN TEST AS REPORT_DATE_TEST ON TEST.FacilityID_UUID = REPORT_DATE_TEST.FacilityID_UUID
AND REPORT_DATE_TEST.Create_Date = '2014-09-16
WHERE REPORT_DATE_TEST.FacilityID_UUID IS NULL;

答案 1 :(得分:0)

查询速度取决于很多因素,你可以比这里的任何人更好地调整它。我们来看看您的数据和查询。

SELECT FacilityID_UUID FROM TEST where FacilityID_UUID not in 
         (SELECT distinct FacilityID_UUID FROM TEST where Create_Date = '2014-09-16')

此查询正在检查TEST的每一行,并返回那些不在Create_Date为的设施列表中的值。这肯定会很慢。对于N个项目,您要比较可能相当大的N的某个子集。如果TEST是一个大表(如果每个工具每天都有一个新的条目,那么它就会),那么你将遇到速度问题。

更好的查询是:

Select FacilityID_UUID, max(Create_Date) from TEST where Create_Date < CURDATE() - 1
                 group by FacilityID_UUID order by FacilityID_UUID;

这应该接近正确的数据(可能需要调整where子句,我不会在MySQL中使用日期做很多工作)。

相关问题