Выборка продуктов по нужным свойствам - 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)
В ответ получаю 3 товара, в которых фильтр равно 862431302

ИЛИ

12559183.
product_id
722755
1164352
1396163
Подскажите, как получить только те товары, в которых есть фильтр 862431302

И

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) с использованием подзапросов для получения значений фильтров. Список действий в коде:

  1. SELECT p.product_id - выбираем идентификатор продукта из таблицы products
  2. (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
  3. (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
  4. FROM product p - указываем таблицу, из которой происходит выборка (таблица products)
  5. HAVING filter1 <> '' AND filter2 <> '' - применяем условие, что значения фильтров не пустые (что-то вроде валидации) Этот запрос вернет список продуктов с их идентификаторами и значениями фильтров, если они не пустые.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 3.909 из 5
Похожие ответы