Я не понимаю, что происходит со всеми ваши keys
и ids
(и я сомневаюсь, что вы тоже), поэтому я их игнорировал ...
Рассмотрим следующее ...
DROP TABLE IF EXISTS t1;
CREATE TABLE t1
(product VARCHAR(12) NOT NULL
,price INT NOT NULL
,date DATE NOT NULL
,PRIMARY KEY(product,price)
);
INSERT INTO t1 VALUES
('cheese',23,'2015-02-09'),
('cheese',30,'2015-02-10'),
('eggs',3,'2015-01-11'),
('cheese',22,'2015-04-11');
DROP TABLE IF EXISTS t2;
CREATE TABLE t2
(product VARCHAR(12) NOT NULL
,min_price INT NOT NULL
,min_date DATE NOT NULL
,PRIMARY KEY(product,min_date)
);
INSERT INTO t2 VALUES
('cheese',22,'2015-03-11'),
('cheese',19,'2015-02-11'),
('cheese',15,'2015-01-13'),
('eggs',3,'2015-01-10');
Этот запрос возвращает последнюю (т.е. максимум) min_date
от t2 меньше, чем дата t1, связанные с данным продуктом ...
SELECT t1.*
, MAX(min_date) min_date
FROM t1
JOIN t2
ON t2.product = t1.product
AND t2.min_date <= t1.date
GROUP
BY t1.product, t1.date
Чтобы получить связанный t2.min_price, просто присоедините t2 к этому результату ...
SELECT a.*
, b.min_price
FROM
(SELECT t1.*
, MAX(min_date) min_date
FROM t1
JOIN t2
ON t2.product = t1.product
AND t2.min_date <= t1.date
GROUP
BY t1.product, t1.date
) a
JOIN t2 b
ON b.product = a.product
AND b.min_date = a.min_date;
+---------+-------+------------+------------+-----------+
| product | price | date | min_date | min_price |
+---------+-------+------------+------------+-----------+
| cheese | 23 | 2015-02-09 | 2015-01-13 | 15 |
| cheese | 30 | 2015-02-10 | 2015-01-13 | 15 |
| cheese | 22 | 2015-04-11 | 2015-03-11 | 22 |
| eggs | 3 | 2015-01-11 | 2015-01-10 | 3 |
+---------+-------+------------+------------+-----------+
Как вы собираетесь связывать сыр с id = 2 на t1 с t2? –
@ Rodney: для id = 2, дата в t1 равна 04/11, mysql должен искать самую последнюю цену в t2 до этой даты, которая в этом случае равна 03/11. Подумайте о t2 как о прейскуранте цен, который постоянно обновляется, и я хочу знать, какова фактическая цена продажи (в t1). Благодаря! –
Шаг 1. Сохраняет даты как DATE – Strawberry