Mysql 在两个条目之间的日期加入

Mysql 在两个条目之间的日期加入,mysql,Mysql,我有以下两个表格: 作为t1交付 提货时,交货表有记录 及 司机调度历史记录为t2 司机调度历史记录表跟踪司机被分配调度的时间 我的主要目标是加入t1.date=t2.date和t1.driver\u id=t2.driver\u id以获得driver\u id 问题:历史记录表不是每天跟踪任务,而是使用时间间隔。若我在一个月前指派司机调度,它将只有一个条目。如果我今天更改该驱动程序的调度,它将从今天开始添加另一个条目,而且,如果我多次更改调度,它将为同一天添加多个具有不同时间戳的条目,并且我

我有以下两个表格:

作为t1交付

提货时,交货表有记录

司机调度历史记录为t2

司机调度历史记录表跟踪司机被分配调度的时间

我的主要目标是加入t1.date=t2.date和t1.driver\u id=t2.driver\u id以获得driver\u id

问题:历史记录表不是每天跟踪任务,而是使用时间间隔。若我在一个月前指派司机调度,它将只有一个条目。如果我今天更改该驱动程序的调度,它将从今天开始添加另一个条目,而且,如果我多次更改调度,它将为同一天添加多个具有不同时间戳的条目,并且我需要在分配之间匹配交付时间

问题:虽然内部连接不是问题,但我无法找到满足上述逻辑的解决方案

SELECT 
 t1.date, t1.driver_id, t2.dispatch_id
FROM 
 DELIVERY as t1
INNER JOIN 
 DRIVER_DISPATCH_HISTORY as t2
  ON t1.date=t2.date 
   AND 
     t1.driver_id=t2.driver_id
假设driver_id和dispatch_id匹配,并且可能会有许多交付


您需要的是低于交货日期的最高发货日期。编写一个子查询来查找此日期,然后将其与调度历史表联接以获取调度ID

SELECT x.driver_id, x.date, y.dispatch_id
FROM (
    SELECT t1.driver_id, MAX(t2.date) AS dispatch_date, t1.date
    FROM delivery AS t1
    JOIN driver_dispatch_history AS t2 
    ON t1.driver_id = t2.driver_id AND t1.date > t2.date
    GROUP BY t1.driver_id, t1.date) AS x
JOIN driver_dispatch_history AS y
ON x.driver_id = y.driver_id AND x.dispatch_date = y.date

您需要的是低于交货日期的最高发货日期。编写一个子查询来查找此日期,然后将其与调度历史表联接以获取调度ID

SELECT x.driver_id, x.date, y.dispatch_id
FROM (
    SELECT t1.driver_id, MAX(t2.date) AS dispatch_date, t1.date
    FROM delivery AS t1
    JOIN driver_dispatch_history AS t2 
    ON t1.driver_id = t2.driver_id AND t1.date > t2.date
    GROUP BY t1.driver_id, t1.date) AS x
JOIN driver_dispatch_history AS y
ON x.driver_id = y.driver_id AND x.dispatch_date = y.date
试试这个

首先,您要进行内部选择和mindate,该值大于查找分派的enddate的日期。一旦有了表H,就很容易将交货日期与该H的发货日期范围进行比较

我只回了2行…因为看你的第一批货,它发生在任何发货之前,所以它不适合任何日期范围。

在阅读了@Barmar的逻辑之后,我认为它更简单,我写了另一个变体

试试这个

首先,您要进行内部选择和mindate,该值大于查找分派的enddate的日期。一旦有了表H,就很容易将交货日期与该H的发货日期范围进行比较

我只回了2行…因为看你的第一批货,它发生在任何发货之前,所以它不适合任何日期范围。

在阅读了@Barmar的逻辑之后,我认为它更简单,我写了另一个变体


@RyanVincent想要的是交付前最新调度历史记录中的调度ID。添加了一个图像以可视化预期的调度logic@RyanVincent他想要的是发货前最新发货历史记录中的发货ID。添加了一个图像以可视化预期逻辑我认为如果您添加GROUP BY,此查询也可以运行t1.driver\u id,t1.date到内部选择谢谢,我忘了。很好,我喜欢你的解决方案。我认为如果你将GROUP BY t1.driver\u id,t1.date添加到内部选择中,这个查询也能工作。谢谢,我忘了。很好,我喜欢你的解决方案。
SELECT x.driver_id, x.date, y.dispatch_id
FROM (
    SELECT t1.driver_id, MAX(t2.date) AS dispatch_date, t1.date
    FROM delivery AS t1
    JOIN driver_dispatch_history AS t2 
    ON t1.driver_id = t2.driver_id AND t1.date > t2.date
    GROUP BY t1.driver_id, t1.date) AS x
JOIN driver_dispatch_history AS y
ON x.driver_id = y.driver_id AND x.dispatch_date = y.date
SELECT D.date,D.driver_id,H.dispatch_id,
       H.startdate as `Dispatch_Start`,
       H.enddate as `Dispatch_End`
FROM DELIVERY D
INNER JOIN
  (SELECT H2.date as startdate,
      (SELECT MIN(date) 
       FROM DRIVER_DISPATCH_HISTORY H1
       WHERE H1.driver_id = H2.driver_id AND H1.date > H2.date
       ) as enddate,
       driver_id,
       dispatch_id
    FROM DRIVER_DISPATCH_HISTORY H2)H
ON D.driver_id = H.driver_id
AND D.date >= H.startdate
AND (D.date < H.enddate OR H.enddate IS NULL)
SELECT D.date,D.driver_id,
    (SELECT dispatch_id FROM DRIVER_DISPATCH_HISTORY as H
     WHERE H.driver_id = D.driver_id AND H.Date < D.date
     ORDER BY H.date DESC LIMIT 1) as dispatch_id
FROM DELIVERY as D