Выборка продуктов по нужным свойствам - MySQL
Формулировка задачи:
Есть таблица с товарами
CREATE TABLE IF NOT EXISTS `product` ( `product_id` INT(11) NOT NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8; INSERT INTO `product` (`product_id`) VALUES (722755), (1164352), (1396163);
Есть таблица с соответствием значений фильтра товару
CREATE TABLE IF NOT EXISTS `product_filter` ( `product_id` INT(11) NOT NULL, `filter_id` INT(11) NOT NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8; INSERT INTO `product_filter` (`product_id`, `filter_id`) VALUES (722755, 12559183), (722755, 862431302), (1164352, 12559183), (1164352, 512268556), (1164352, 862431302), (1396163, 12559183), (1396163, 616358346);
Делаю запрос
SELECT DISTINCT p.product_id FROM product p INNER JOIN product_filter f ON (p.product_id = f.product_id) WHERE filter_id IN(862431302,12559183)
ИЛИ
12559183.product_id 722755 1164352 1396163
И
12559183?Нужно получить такой ответ:
product_id 722755 1164352
Решение задачи: «Выборка продуктов по нужным свойствам»
textual
Листинг программы
SELECT p.product_id, (SELECT product_id AS filter_1 FROM product_filter pf1 WHERE pf1.filter_id = 862431302 AND p.product_id = pf1.product_id) AS filter1, (SELECT product_id AS filter_2 FROM product_filter pf2 WHERE pf2.filter_id = 12559183 AND p.product_id = pf2.product_id) AS filter2 FROM product p HAVING filter1 <> '' AND filter2 <> ''
Объяснение кода листинга программы
В этом коде происходит выборка из таблицы продуктов (product) по их идентификаторам (product_id) с использованием подзапросов для получения значений фильтров. Список действий в коде:
- SELECT p.product_id - выбираем идентификатор продукта из таблицы products
- (SELECT product_id AS filter_1 FROM product_filter pf1 WHERE pf1.filter_id = 862431302 AND p.product_id = pf1.product_id) AS filter1 - выполняем подзапрос для получения значения фильтра с идентификатором 862431302
- (SELECT product_id AS filter_2 FROM product_filter pf2 WHERE pf2.filter_id = 12559183 AND p.product_id = pf2.product_id) AS filter2 - выполняем подзапрос для получения значения фильтра с идентификатором 12559183
- FROM product p - указываем таблицу, из которой происходит выборка (таблица products)
- HAVING filter1 <> '' AND filter2 <> '' - применяем условие, что значения фильтров не пустые (что-то вроде валидации) Этот запрос вернет список продуктов с их идентификаторами и значениями фильтров, если они не пустые.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д