首页 > 解决方案 > MYSQL:使用查询优化请求(1,n 关系)

问题描述

这是我的担忧:我有一个关于两个表的请求,我想优化 1,n 关系。表 1 是计划表,其中的线条代表患者的过时事件。表 2 是一个病人护理表,有开始和结束日期。

**Table 1 : Planning**
Id
Begin
End
Patient_care_id

**Table 2 : Patient care**
Id
id_patient_care
Id patient
Begin 
End

表 1 的每一行必须至少被表 2 中的一行按日期覆盖,但它可以被几行第 2 行覆盖。我无法将 t1 行链接到 t2 中的唯一 ID。

我的请求在表 1 中找到表 2 日期涵盖的行,并与 table1.patient_care_id = table 2.patient_care_id 链接。为了继续,我提出了一个子请求:

select id 
from table1
where id not in
(
    select table1.id 
    from table1 t1 
    inner join table2 t2 on t1.patient_care_id = t2.id
    where t1.begin >= t2.begin and t1.end <= t2.end
 )

注意:干预是一天,t2是计划天(从00:00:00开始到23:59:59结束)不能涵盖几天,这就是我使用t1.begin进行比较的原因......我可以使用 t1.end)

例子 :

T1-Planning
Id : 1
Patient_care_id : Amapa
Begin : 2020-01-01 14:00:00
End : 2020-01-01 16:00:00

Id : 2
Patient_care_id : Amapa
Begin : 2020-01-02 14:00:00
End : 2020-01-02 16:00:00


T2: Patient care
Id : 1
Patient_care : Amapa
begin : 2020-01-02 00:00:00
end : 2020-01-31 23:59:59

在这里,我希望请求从 t1 发送我的 Id 1(不在 t2 日期范围内),而不是从 T1 发送 Id 2(在 T2 日期范围内)。

有没有办法在不发出子请求的情况下优化这个请求?

先感谢您。

标签: mysqloptimizationrequest

解决方案


SELECT  t1.id
    FROM  Planning AS p
    LEFT JOIN  PatientCare AS c  ON p.patient_care_id = c.id
    WHERE  p.begin >= c.begin
      AND  p.end <= c.end
      AND  c.id IS NULL;    -- to catch rows that failed the time check

注意:如果时间范围可以重叠,则需要对开始/结束子句进行修改。


推荐阅读