MySQL JOIN基于最高日期和非唯一列

时间:2011-06-09 02:06:44

标签: mysql sql join

我正在处理我正在处理的MySQL查询。我的数据如下。

表1

id   date1        text     number
---|------------|--------|-------
1  | 2012-12-12 | hi     | 399 
2  | 2011-11-11 | so     | 399
5  | 2010-10-10 | what   | 555
3  | 2009-09-09 | bye    | 300
4  | 2008-08-08 | you    | 300

表2

id   number   date2        ref
---|--------|------------|----
1  | 399    | 2012-06-06 | 40
2  | 399    | 2011-06-06 | 50
5  | 555    | 2011-03-03 | 60

对于表1中的每一行,我想从表2中获得零或一个ref值。表1中每行的结果应该有一行。数字列对于任何一个表都不是唯一的,所以必须使用date1&进行连接。 date2列,其中date2是数字的最高值,但不超过该数字的date1。

上述例子的预期结果就是这样。

 date1        text     number   ref
------------|--------|--------|-----
 2012-12-12 | hi     | 399    | 40
 2011-11-11 | so     | 399    | 50
 2010-10-10 | what   | 555    | null
 2009-09-09 | bye    | 300    | null
 2008-08-08 | you    | 300    | null

你可以在结果的第一行看到,ref是40被选中,因为在table2中,ref = 40的记录的date2小于date1,以及满足该条件的最高日期。 在结果的第二行中,选择了ref为50,因为在table2中,ref = 50的记录的date2小于date1,并且是满足该条件的最高日期。 其余的结果都有空引用,因为date1总是较少或table2中不存在相应的数字。

我已经到了某一点,但我被困住了。我到目前为止的查询是这样的。

SELECT date1, text, number, ref
FROM table1
LEFT JOIN (
    SELECT * 
    FROM (
        SELECT * 
        FROM table2
        WHERE date2 <= '2012-12-12'
        ORDER BY date2 DESC
    ) tmp 
    GROUP BY msisdn
) tmp ON table1.number = table2.number;

问题是硬编码日期不会,它应该基于date1,但我不能使用date1,因为它在外部查询中。有没有办法让这项工作成功?

2 个答案:

答案 0 :(得分:1)

我刚才用不同的表尝试了类似的例子,并且能够得到你想要的东西。下面是一个类似的查询,以满足您的需求。如果您正在寻找,可能需要将<更改为<=

SELECT a.date1, a.text, b.ref
FROM table1 a LEFT JOIN table2 b ON 
                        ( a.number = b.number
                          AND  a.date1 > b.date2 
                          AND b.date2 = ( SELECT MAX(x.date2) 
                                          FROM table2 x 
                                          WHERE x.number = b.number 
                                             AND x.date2 < a.date1)
                        )

答案 1 :(得分:0)

未测试:

SELECT t1.date1, 
       t1.text,
       t1.number,
       (SELECT a.ref
          FROM TABLE_2 a
          JOIN (SELECT t.number,
                       MAX(t.date2) AS max_date
                  FROM TABLE_2 t
                 WHERE t.number = t1.number
                   AND t.date2 <= t1.date1
              GROUP BY t.number) b ON b.number = a.number
                                  AND b.max_date = a.date2)
  FROM TABLE_1 t1

问题是在子选择的派生表中使用t1 ...