我得到此表“ A”:
| id | date | =================== | 1 | 2010-01-13 | | 2 | 2011-04-19 | | 3 | 2011-05-07 | | .. | ... |
这个表“ B”:
| date | value | ====================== | 2009-03-29 | 0.5 | | 2010-01-30 | 0.55 | | 2011-08-12 | 0.67 |
现在,我正在寻找一种方法来联接这两个表,这些表的“ B”中的“值”列映射到“ A”中的日期。对我来说,棘手的部分是表“ B”仅存储更改日期和新值。现在,当我需要在表“ A”中使用该值时,SQL需要回顾其要求该值的日期之后的下一个日期。
因此,这些表的JOIN最终应如下所示:
| id | date | value | =========================== | 1 | 2010-01-13 | 0.5 | | 2 | 2011-04-19 | 0.55 | | 3 | 2011-05-07 | 0.55 | | .. | ... | ... |
我怎样才能做到这一点?
-- Create and fill first table CREATE TABLE `id_date` ( `id` int(11) NOT NULL auto_increment, `iddate` date NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; INSERT INTO `id_date` VALUES(1, '2010-01-13'); INSERT INTO `id_date` VALUES(2, '2011-04-19'); INSERT INTO `id_date` VALUES(3, '2011-05-07'); -- Create and fill second table CREATE TABLE `date_val` ( `mydate` date NOT NULL, `myval` varchar(4) collate utf8_bin NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; INSERT INTO `date_val` VALUES('2009-03-29', '0.5'); INSERT INTO `date_val` VALUES('2010-01-30', '0.55'); INSERT INTO `date_val` VALUES('2011-08-12', '0.67'); -- Get the result table as asked in question SELECT iddate, t2.mydate, t2.myval FROM `id_date` t1 JOIN date_val t2 ON t2.mydate <= t1.iddate AND t2.mydate = ( SELECT MAX( t3.mydate ) FROM `date_val` t3 WHERE t3.mydate <= t1.iddate )
我们正在做什么:
id_date
A
date_val
B