【问题标题】:How to join two tables based on date? MYSQL如何根据日期连接两个表? MYSQL
【发布时间】: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


【解决方案1】:

您可以将JOIN 条件重写为:

FROM t1
JOIN t2 ON t1.company_id = t2.company_id AND
   (t1.actual_checkdate = t2.expected_checkdate OR
    t1.actual_checkdate BETWEEN 
       DATE_SUB(t2.expected_checkdate, INTERVAL 10 DAY) 
       AND DATE_ADD(t2.expected_checkdate, INTERVAL 10 DAY)
    AND NOT EXISTS (SELECT * FROM t1 WHERE t1.actual_checkdate = t2.expected_checkdate AND t1.company_id = t2.company_id)
 )

如果存在实际匹配,NOT EXISTS 子句将阻止在附近日期匹配。

【讨论】:

  • 区间是否包含 t1.actual_checkdate = t2.expected_checkdate?
  • 是的,这就是为什么我有 NOT EXISTS 子句来防止在已经完全匹配时进行间隔匹配的原因。由于 NOT EXISTS 子句,您不能使用间隔来检查完全匹配,这就是为什么检查完全匹配也在 WHERE 子句中。
猜你喜欢
  • 2022-07-25
  • 1970-01-01
  • 2020-01-07
  • 1970-01-01
  • 1970-01-01
  • 2021-11-10
  • 1970-01-01
  • 2020-02-17
  • 1970-01-01
相关资源
最近更新 更多