mysql - 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 日期范围内)。
有没有办法在不发出子请求的情况下优化这个请求?
先感谢您。
解决方案
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
注意:如果时间范围可以重叠,则需要对开始/结束子句进行修改。
推荐阅读
- python - 两个有许多关系的 Django 树模型
- java - 如何以 JSON 格式下载 WordPress 数据?
- python - 如何确保 con1D 的 output_shape 与 keras 自动编码器中具有时间序列的 input_shape 相同?
- apache-kafka - 如何忽略从同一主题读取和写入不同事件类型的 Kafka Streams 应用程序中的某些类型的消息
- jupyter-notebook - 如何优雅地退出 jupyter notebook 上的 ipython 脚本
- php - 在更改下拉列表时提交表单以重新排序同一页面上的项目
- python - 如何从 def 永久更改全局变量
- powershell - 在任意长度的子字符串上拆分字符串 (Powershell)
- dialogflow-es - 是否可以使用对话流访问本地网络设备 API?
- python - keras - 评估生成器使用相同的训练数据产生不同的准确率