Mam dwie tabele:
- test_a (zawiera tylko daty)
- test_b (zawiera daty i jakieś inne dane w tym pole na datę wiążącą z tabelą test_a)
Daty w test_a i test_b mogą się wzajemnie pokrywać, ale mogą nie występować w drugiej z tabeli.
Innymi słowy pełna dowolność kombinacji.
Początkowy stan tabel:
test_a:
CREATE TABLE IF NOT EXISTS `test_a` ( `test_a_data` date NOT NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8; INSERT INTO `test_a` (`test_a_data`) VALUES ('2013-04-28'), ('2013-05-03'), ('2013-05-05'), ('2013-05-06'), ('2013-05-07'), ('2013-05-09'), ('2013-05-10');
test_b:
CREATE TABLE IF NOT EXISTS `test_b` ( `test_b_data` date NOT NULL, `test_a_data` date DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8; INSERT INTO `test_b` (`test_b_data`, `test_a_data`) VALUES ('2013-05-02', NULL), ('2013-05-05', NULL), ('2013-05-06', NULL), ('2013-05-08', NULL);
Muszę połączyć te tabele uzupełniając w test_b pole test_a_data w taki sposób, że:
1. jeżeli data test_b.test_b_data występuje w tabeli test_a, to datę tę przypisuję do test_b.test_a_data
2. jeżeli nie występuje, to test_b.test_a_data muszę uzupełnić najbliższą datą test_a.test_a_data lecz nie większą niż test_b.test_a_data
Pierwszy punkt łatwo zrobić SQL'em:
UPDATE `test_b` LEFT JOIN `test_a` ON `test_b`.`test_b_data` = `test_a`.`test_a_data` SET `test_b`.`test_a_data` = `test_b`.`test_b_data` WHERE `test_a`.`test_a_data` IS NOT NULL
Ale jak zrobić SQL'em punkt 2?
Wynik, którego oczekuję:
INSERT INTO `test_b` (`test_b_data`, `test_a_data`) VALUES ('2013-05-02', '2013-04-28'), ('2013-05-05', '2013-05-05'), ('2013-05-06', '2013-05-06'), ('2013-05-08', '2013-05-07');
Punkt 2 mogę oczywiście zrobić za pomocą PHP i SQL, ale chciałbym ten punkt załatwić na poziomie MySQL jednym SQL'em.