如何根据日期加入两个表? MYSQL

时间:2018-04-13 15:06:52

标签: mysql duplicates left-join intervals dateadd

我试图加入两个都有检查日期的表。仅当第一个表中的检查日期等于第二个表中的检查日期时,结果才会显示。或者,如果两个表中的检查日期在10天之内。

我有两张桌子:

t1 table: company_id, expected_checkdate

t2 table: company_id, actual_checkdate
  • 条件1: acutal_checkdate = expected_checkdate
  • 条件2:在expected_checkdate的10天内执行acutal_checkdate
  • 条件3:在acutal_checkdate的10天内预期_checkdate
  • 条件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    | 
      |---------------------|------------------|------------------|

前两行和后两行是正确的。第三行和第四行不应显示,因为它们是第一行和第二行的副本。请帮我完成上面的联接。

1 个答案:

答案 0 :(得分:0)

您可以将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子句将阻止在附近日期进行匹配。