【发布时间】:2018-09-23 23:53:31
【问题描述】:
我正在尝试加入两个都有检查日期的表。仅当第一个表中的检查日期等于第二个表中的检查日期时,结果才应显示。或者如果两个表中的检查日期在 10 天内。
我有两张桌子:
t1 table: company_id, expected_checkdate
t2 table: company_id, actual_checkdate
- 条件一: acutal_checkdate = expected_checkdate
- 条件 2: 在 expected_checkdate 的 10 天内 acutal_checkdate
- 条件 3: expected_checkdate 在 acutal_checkdate 的 10 天内
-
条件 4:如果 acutal_checkdate = expected_checkdate 则不要检查 10 天内的其他人
LEFT OUTER JOIN t2 ON t1.actual_checkdate = t2.expected_checkdate OR t1.actual_checkdate BETWEEN DATE_ADD(t2.expected_checkdate, INTERVAL -10 DAY) AND DATE_ADD(t2.expected_checkdate, INTERVAL 10 DAY) AND t1.company_id = t2.company_id
问题是当我运行这个一个月时。我看到很多重复项,因为一个月内可能有 2 个 actual_checkdate 条目或 2 个 expected_checkdate。
|---------------------|------------------|------------------|
| company_id | actual_checkdate |expected_checkdate|
|---------------------|------------------|------------------|
| 12 | 2018-01-05 | 2018-01-05 |
|---------------------|------------------|------------------|
| 12 | 2018-01-19 | 2018-01-19 |
|---------------------|------------------|------------------|
| 12 | 2018-01-05 | 2018-01-19 | -- incorrect
|---------------------|------------------|------------------|
| 12 | 2018-01-19 | 2018-01-05 | -- incorrect
|---------------------|------------------|------------------|
| 13 | 2018-01-12 | 2018-01-20 |
|---------------------|------------------|------------------|
| 14 | 2018-01-26 | 2018-01-36 |
|---------------------|------------------|------------------|
前两行和后两行是正确的。第三行和第四行不应显示,因为它们与第一行和第二行重复。请帮我完成上面的加入。
【问题讨论】:
-
嗨。您既没有描述也没有编码您想要的实际表格。根据其列给出行在结果中的条件。 “加入表格以查找...”不明确或不准确。另请注意,它恰好是用一种对代码进行转述的风格来表达的,这可以没问题,但这不是我刚才建议的措辞风格。 PS请阅读并采取行动minimal reproducible example。
-
@philipxy 我编辑了帖子。这是正确的吗?
-
鉴于 +/- 10 天的间隔,您的两条不正确的行不可能出现在输出中,因为它们不符合
BETWEEN条件 -
您的条件被解析为
(t1.a = t2.e) OR ((t1.a BETWEEN ... AND ...) AND t1.id = t2.id),但您想要((t1.a = t2.e) OR (t1.a BETWEEN ... AND ...)) AND t1.id = t2.id。您的条件适用于t1 join t2 using id中的行。即,如果您按照我所说的进行了描述并恰好在结果中出现一行,那么您会得到“公司 t1.id 期望 t1.e 和公司 t2.id 具有实际 t2 的行” .a & t1.id=t2.id & 条件”。那是t1 join t2 on id & (OR of 4 conditions)。 PS 但是你真的描述了你真正想要的行吗? (我怀疑不是。)PPS minimal reproducible example!
标签: mysql duplicates left-join intervals dateadd