MySQL:在包含特定日期的另一个表中的每一行中查找一个表中的最新行

时间:2014-09-30 04:54:30

标签: mysql

很难创建mysql查询来执行以下操作。

我们有一个列表的工作人员列表如下:

eg: employee table
name    em_date   (other cols)
Fred    1-1-1960
Fred    1-1-1970
Fred    1-1-1980
John    1-1-1960
John    1-1-1990

我们有第二个包含家庭详细信息的表:

Partners table
name       marriage_date     partner_name     (other cols)
Fred       1-1-1959          Sue
Fred       1-1-1969          Marg
John       1-1-1985          Joan

我正在尝试生成一个包含以下内容的表: name,employment_date,marriage_date,partner_name

有些员工多次受雇(想想承包商),所以他们有多个就业日期。他们中的一些人也再婚,所以在不同的时间有不同的伴侣(和/或可能在某个时候没有结婚)

我需要输出结果才能显示合作伙伴。

输出应为:

name       em_date      mar_date     partner_name
Fred       1-1-1960     1-1-1959     Sue
Fred       1-1-1970     1-1-1969     Marg
Fred       1-1-1980     1-1-1969     Marg
John       1-1-1960     null         null
John       1-1-1990     1-1-1985     Joan

我确信我可以使用下面链接中的SQL,但是我无法解决它 https://dba.stackexchange.com/questions/27823/query-to-find-closest-lesser-date

任何指针都非常感激 - 我会包括我尝试过但我已经尝试过多而且它只是不起作用。我要么得到笛卡尔积,要么得一排。

名称上有关键字和2个日期,但没有其他关键字(即:在雇用时没有将员工与其合作伙伴联系起来的ID [认为事后导入旧数据...])我必须按名称搜索并根据计算匹配最近的合作伙伴:

min(employment_date - marriage date)

非常感谢提前。

编辑:员工表的主键是组合名称,雇用日期。合作伙伴表的PK是组合名称,结婚日期。如果我可以改变它,我会....

因为我是新用户而无法编辑而无法编辑......

编辑:sqlfiddle: http://sqlfiddle.com/#!2/84148/2

1 个答案:

答案 0 :(得分:0)

令人惊讶的是,我能够偶然发现与我的问题类似的东西,以至于我能够解决它。感谢所有贡献者。

以下是我找到的解决方案:

select t2.emp_name, t2.start_date, t1.spouse_name, t1.mar_yr
from
    ( select t2.emp_name, t2.start_date, 
        ( select max(mar_yr)
          from   partners t1
          where  t1.emp_name = t2.emp_name
            and  t1.mar_yr <= year(t2.start_date)
    ) as mar_yr
  from employees t2) t2
left outer join
    partners t1 on t2.emp_name = t1.emp_name and t2.mar_yr = t1.mar_yr;

SQLFiddle在这里:http://sqlfiddle.com/#!2/84148/13

它正是我所需要的。感谢所有为早些时候找不到解决方案做出贡献的人,以及顺便提一下,在这里: MySQL - Selecting the latest records before a given date in a JOIN