Sye*_*idi 6 mysql sql postgresql date-range left-join
我需要在两个表中加入一个where条件:
time_table
id rid start_date end_date
1 2 2017-07-01 00:00:00 2018-11-01 00:00:00
2 5 2017-01-01 00:00:00 2017-06-01 00:00:00
3 2 2018-07-01 00:00:00 2020-11-01 00:00:00
Run Code Online (Sandbox Code Playgroud)
record_table
id name date
1 record1 2017-10-01 00:00:00
2 record2 2017-02-01 00:00:00
3 record3 2017-10-01 00:00:00
Run Code Online (Sandbox Code Playgroud)
我需要获取在给定日期范围内出现的所有记录.在上面的例子中,我需要那些rid = 2仅在范围内的记录.因此,上述查询的输出必须是:
1 record1 2017-10-01 00:00:00
3 record3 2017-10-01 00:00:00
Run Code Online (Sandbox Code Playgroud)
左边连接两个带有where条件的表
这里有一个陷阱等着你.使用a时LEFT [OUTER] JOIN,使用条件进行过滤通常是错误的WHERE,从而使a 的特殊功能无效地无条件地LEFT JOIN包含左表中的所有行.详细说明:
因此,将条件放入WHERE应该过滤所有rows(rid = 2)的子句中,但是将from-join行的record_table条件设置为实际的连接条件:
SELECT t.start_date, t.end_date -- adding those
, r.id, r.name, r.date
FROM time_table t
LEFT JOIN record_table r ON r.date >= t.start_date
AND r.date < t.end_date
WHERE t.rid = 2;
Run Code Online (Sandbox Code Playgroud)
如评论所示,time_table在结果中包含列是有意义的,但这是我的可选添加.
您还需要非常清楚上限和下限.一般约定是在time()范围中包括 lower并排除上限timestamp.因此我使用>=和<以上.
有关:
使用正确的索引,性能应该没有问题.你需要一个索引(或PK)time_table上(rid),另一个在record_table上(date).