2015-08-02 2 views
0

У меня есть структуру таблицы следующим образом:Как написать запрос, чтобы получить специальную цену при наличии

-- 1 price type. 

    CREATE TABLE IF NOT EXISTS `price_type` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `type` varchar(50) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ; 

INSERT INTO `price_type` (`id`, `type`) VALUES 
(1, 'Normal price'), 
(2, 'Special price'); 

-- 2 Products 

CREATE TABLE IF NOT EXISTS `product` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `name` varchar(100) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ; 

INSERT INTO `product` (`id`, `name`) VALUES 
(1, 'Tshirt'), 
(2, 'Shirt'), 
(3, 'Pants'), 
(4, 'Pull over'); 

-- 3 Product price 

CREATE TABLE IF NOT EXISTS `product_price` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `product_id` int(11) NOT NULL, 
    `price_type_id` int(11) NOT NULL, 
    `price` float NOT NULL, 
    `start_date` date NOT NULL, 
    `end_date` date NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=6 ; 

INSERT INTO `product_price` (`id`, `product_id`, `price_type_id`, `price`, `start_date`, `end_date`) VALUES 
(1, 1, 1, 300, '0000-00-00', '0000-00-00'), 
(2, 2, 1, 500, '0000-00-00', '0000-00-00'), 
(3, 3, 1, 400, '0000-00-00', '0000-00-00'), 
(4, 3, 2, 150, '2015-08-01', '2015-11-02'), 
(5, 4, 1, 600, '0000-00-00', '0000-00-00'); 

Ожидаемый результат (особый период времени): enter image description here

Продукция (продукт) цены хранятся в другой таблице (product_price) с разными типами цен (price_type).

В этом случае товарные штаны имеют специальную цену 150,00 между 2015-08-01 и 2015-11-02. Поэтому он должен показывать специальную цену, а не обычную цену 400,00

Как я могу написать запрос?

+0

попробуйте прочитать о присоединяется и как использовать их – Satya

+0

дата не относящихся к операции, которую вы хотите. Это как @satya сказал простой операции JOIN. Постарайтесь прочитать об этом, а затем покажите нам, что вы пробовали. Затем вы обновите свой вопрос с помощью своего sql. SO не является домашним сервисом. –

+0

проверить ответы на этот вопрос http://stackoverflow.com/questions/14885912/select-case-when-then-select –

ответ

1

Вы можете присоединиться к ценовому столу дважды, один раз, чтобы получить нормальную цену и один раз (влево) по специальной цене, если есть какое-либо, что действительно на сегодня.

В списке полей вы можете использовать coalesce, чтобы получить специальное предложение, возвратившись к нормальной цене. Таким образом, вы можете легко вернуть текущую цену из запроса, независимо от того, какого типа он:

select p.id as product_id, 
     p.name, 
     np.price as normal_price, 
     sp.price as special_price, 
     sp.end_date as special_price_end_date, 

     coalesce(sp.price, np.price) as current_price 
from product p 
inner join product_price np 
     on np.product_id = p.id 
     and np.price_type_id = 1 
left join product_price sp 
     on sp.product_id = p.id 
     and sp.price_type_id = 2 
     and CURRENT_DATE() between sp.start_date and sp.end_date 
+0

Тролль, спасибо вам большое! он дает результат, как я ожидал. Чтобы задать вопрос, я упростил структуру таблицы. Надеюсь, это сработает для моей реальной потребности. – San

1

Что-то вроде:

SELECT pp.id, p.name, pp.price, pp.start_date, pp.end_date FROM product_price pp 
INNER JOIN product p 
ON pp.product_id=p.id 
WHERE 
(pp.start_date < '2015-08-01' AND pp.end_date > '2015-08-01') 
OR (pp.start_date IS NULL AND pp.end_date IS NULL) 
GROUP BY p.name 
ORDER BY pp.price_type_id DESC 
+0

Большое спасибо за ваш повтор, и это решение работает так, как мне было нужно. Когда я выполнил код для моей актуальной проблемы, решение Golez Trols работает хорошо. – San

Смежные вопросы