Брать значение с другой таблицы, если оно есть - MySQL
Формулировка задачи:
Помогите, пожалуйста, составить запрос
Нужно получить получить продукты, цена которых price>=20 AND price<=90
таблица product (все продукты)
product_id|price 1|125 2|100 3|70 4|130 5|70 6|60 7|150
таблица product_discount (содержит только продукты со скидкой)
product_id|new_price 1|99 2|25 4|50
должен быть ответ
product_id 2 3 4 5 6
Пробовал
SELECT p.product_id, IF(pd.new_price <=> NULL, pd.new_price, p.price) AS price FROM product p LEFT JOIN product_discount pd ON (p.product_id = pd.product_id) WHERE price>=20 AND price<=90
В ответ
product_id 3 5 6
Дамп базы
CREATE TABLE `product` ( `product_id` INT(11) NOT NULL, `price` INT(11) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO `product` (`product_id`, `price`) VALUES (1, 125), (2, 100), (3, 70), (4, 130), (5, 70), (6, 60), (7, 150); CREATE TABLE `product_discount` ( `product_id` INT(11) NOT NULL, `new_price` INT(11) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO `product_discount` (`product_id`, `new_price`) VALUES (1, 99), (2, 25), (4, 50);
Решение задачи: «Брать значение с другой таблицы, если оно есть»
textual
Листинг программы
SELECT DISTINCT product_id FROM ( SELECT product_id FROM product WHERE price >= 20 AND price <=90 UNION ALL SELECT product_id FROM product_discount WHERE new_price >= 20 AND new_price <=90 ) x ORDER BY 1;
Объяснение кода листинга программы
- Сначала мы имеем два отдельных запроса на выборку из таблиц
product
иproduct_discount
- Оба запроса имеют условие
WHERE
, которое фильтрует товары по цене (от 20 до 90) - Затем мы используем оператор
UNION ALL
, чтобы объединить результаты обоих запросов в один набор данных - Результат объединения затем сортируется по
product_id
с помощьюORDER BY
- И, наконец, мы используем
DISTINCT
, чтобы убедиться, что каждыйproduct_id
отображается только один раз в итоговом результате.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д