2015-10-12 2 views
0

У меня есть две таблицы, t1 и t2mysql, добавить условия для max()?

t1

key id product price date 
0 0 cheese 23  02/09/15 
1 0 cheese 30  02/10/15 
2 1 eggs  3  01/11/15 
3 2 cheese 22  04/11/15 

t2

key product min_price min_date 
0 cheese  22   03/11/15 
1 cheese  19   02/11/15 
2 cheese  15   01/13/15 
3 eggs  3   01/10/15 

Я хотел бы создать таблицу, как t1, но и показывая MIN_PRICE и min_date от t2, что соответствует дате, непосредственно предшествующей любой дате в t1, сгруппированной по идентификатору:

новая таблица

key id product price date  min_price min_date 
0 0 cheese 23 02/09/15 15   01/13/15 
1 0 cheese 30 02/10/15 15   01/13/15 
2 1 eggs  3  01/11/15 3   01/10/15 
3 2 cheese 22 04/11/15 22   03/11/15 

Как получить новую таблицу MySQL?
Большое спасибо!

+0

Как вы собираетесь связывать сыр с id = 2 на t1 с t2? –

+0

@ Rodney: для id = 2, дата в t1 равна 04/11, mysql должен искать самую последнюю цену в t2 до этой даты, которая в этом случае равна 03/11. Подумайте о t2 как о прейскуранте цен, который постоянно обновляется, и я хочу знать, какова фактическая цена продажи (в t1). Благодаря! –

+0

Шаг 1. Сохраняет даты как DATE – Strawberry

ответ

0

Я не понимаю, что происходит со всеми ваши 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 | 
+---------+-------+------------+------------+-----------+ 
+0

Я еще не вернулся к проблеме, но спасибо большое @Strawberry! –