基于最高日期和非唯一列的MySQL JOIN
问题描述:
我需要一些帮助来处理我正在处理的MySQL查询。我有如下数据。基于最高日期和非唯一列的MySQL JOIN
表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中的零个或一个参考值应该有一个行中的结果对于表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
您可以将结果的第一行中所看到的,裁判40被选中,是因为在表2与REF = 40的记录有date2的是,这是不到DATE1,并能够满足该条件的最高日期。 在结果的第二行中,ref为50,因为在table2中ref = 50的记录的date2小于date1,并且满足该条件的最高日期。 结果的其余部分具有空引用,因为date1总是少于或者表2中不存在对应的数字。
我已经到了一定的地步,但我被卡住了。我到目前为止的查询是这样的。
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;
的问题是硬编码的日期不会做,应该根据日期1,但因为它是在外部查询我不能使用日期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)
)
答
未经测试:
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
...