Вот запрос, который возвращает показанный результат. Я не понимаю, что нужно «обновлять» ...
DROP TABLE IF EXISTS aaa;
CREATE TABLE aaa
(id INT NOT NULL
,visit_date DATE NOT NULL
);
INSERT INTO aaa VALUES
(10003,'2003-09-26'),
(10003,'2004-05-15'),
(10003,'2007-01-09'),
(10003,'2007-07-05');
DROP TABLE IF EXISTS bbb;
CREATE TABLE bbb
(id INT NOT NULL
,visit_date DATE NOT NULL
,BP INT NOT NULL
);
INSERT INTO bbb VALUES
(10003,'2003-09-26',89),
(10003,'2004-05-17',70),
(10003,'2007-01-12',95);
SELECT x.*
, y.visit_date bp_date
, y.bp
FROM
( SELECT a1.*
, COALESCE(MIN(a2.visit_date),CURDATE()) follow_up
FROM aaa a1
LEFT
JOIN aaa a2
ON a2.id = a1.id
AND a2.visit_date > a1.visit_date
GROUP
BY id
, visit_date
) x
LEFT
JOIN bbb y
ON y.id = x.id
AND y.visit_date BETWEEN x.visit_date AND x.follow_up;
+-------+------------+------------+------------+------+
| id | visit_date | follow_up | bp_date | bp |
+-------+------------+------------+------------+------+
| 10003 | 2003-09-26 | 2004-05-15 | 2003-09-26 | 89 |
| 10003 | 2004-05-15 | 2007-01-09 | 2004-05-17 | 70 |
| 10003 | 2007-01-09 | 2007-07-05 | 2007-01-12 | 95 |
| 10003 | 2007-07-05 | 2019-05-30 | NULL | NULL |
+-------+------------+------------+------------+------+