SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 21.06.2013 14:46:01

vivalaakam
Участник
Зарегистрирован: 30.08.2011
Сообщений: 7

Помощь с SQL запросом

Добрый день
Есть 2 таблицы


CREATE TABLE IF NOT EXISTS `table1` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `bill` int(11) DEFAULT NULL,
  `product` int(11) DEFAULT NULL,
  `date` date DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=5 ;


INSERT INTO `table1` (`id`, `bill`, `product`, `date`) VALUES (1, 1, 1, '2013-04-01'), (2, 1, 2, '2013-04-01'), (3, 2, 1, '2013-04-16'), (4, 3, 3, '2013-04-18');

CREATE TABLE IF NOT EXISTS `table2` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `product` int(11) DEFAULT NULL,
  `price` decimal(20,2) DEFAULT NULL,
  `date_from` date DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=5 ;


INSERT INTO `table2` (`id`, `product`, `price`, `date_from`) VALUES (1, 1, '2.00', '2013-03-31'), (2, 1, '5.00', '2013-04-15'), (3, 2, '1.00', '2013-03-31'), (4, 3, '2.00', '2013-03-31');
 

В первой таблице содержится история покупок, во второй цены, и число с которого они действуют

необходимо выбрать из первой таблицы все товары и из второй таблицы цены, притом что цена на дату покупки должна быть максимально близкой к предидущему изменению цен.
Я делаю запросом
SELECT  * FROM table1 AS t1 LEFT JOIN table2 AS t2 ON t1.product = t2.product WHERE date > date_from


но здесь есть лишние записи из преидущих периодов. Собственно вопрос в том, как отобрать записи с максимальной датой и соотв. этой дате ценой

Неактивен

 

#2 21.06.2013 15:07:24

vivalaakam
Участник
Зарегистрирован: 30.08.2011
Сообщений: 7

Re: Помощь с SQL запросом

В принципе, можно отобрать данные таким образом

SELECT * FROM( SELECT  t1.* , t2.price , t2.date_from FROM table1 AS t1 LEFT JOIN table2 AS t2 ON t1.product = t2.product AND date > date_from ORDER BY t1.id , date_from DESC ) AS t GROUP BY t.id

но хотелось бы более изящное решение, т.к. это потом запихивать в еще один запрос

Неактивен

 

#3 21.06.2013 18:17:29

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Помощь с SQL запросом

vivalaakam написал:

В принципе, можно отобрать данные таким образом

SELECT * FROM( SELECT  t1.* , t2.price , t2.date_from FROM table1 AS t1 LEFT JOIN table2 AS t2 ON t1.product = t2.product AND date > date_from ORDER BY t1.id , date_from DESC ) AS t GROUP BY t.id

но хотелось бы более изящное решение, т.к. это потом запихивать в еще один запрос

Это решение неправильное (присмотритесь внимательней к результату).
Почему так, см FAQ №16


Верный вариант:

select t1.*, (select price from table2 t2 where t2.product=t1.product and date_from < `date` order by date_from desc limit 1) price from table1 t1;


P.S. Кстати зачем вы использовали left join? Разве у вас может быть ситуация, что продан товар, у которого не была назначена цена?
Не стоит использовать * в рабочих запросах.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson