Задать вопрос
@Origihor

Множественные объединения c условием?

49eb2398d4c14493ad2e32d5913b04f5.png
SELECT 
  t1.id,
  t1.name AS product,
  t3.name AS color,
  t5.name AS size
FROM
  `product` AS t1
JOIN
  `product_color` AS t2 ON t1.id = t2.product_id
JOIN
  `color` AS t3 ON t2.color_id = t3.id
JOIN 
  `product_size` AS t4 ON t1.id = t4.product_id
JOIN 
  `size` AS t5 ON t4.size_id = t5.id

d8e4db16f006464795613d26771f371b.JPG
Вопрос:
Как получить список товаров удовлетворяющий сразу всем перечисленным ниже условиям?
  • черный цвет и размер S
  • черный цвет и размер M
  • размер L

Псевдокод:
WHERE
 (color = "black" and size = "S")
and
 (color = "black" and size = "M")
and
 (size = "L")

Обратите внимание, свойства "цвет" и "размер" - это поля разных таблиц.
В таблице всего два товара и всем перечисленным условиям удовлетворяет "jacket A".

В реальности, есть множество сущностей узкоспециализированной направленности, свойства этих сущностей хранятся с помощью N:M. Некоторые из этих свойств допускают вложенности, в результате чего, обычный select превращается в строку солидной длинны, не говоря уже о запросе с условием. Может я упустил что, ткните пальцем если не сложно.
  • Вопрос задан
  • 2285 просмотров
Подписаться 2 Оценить Комментировать
Решение пользователя Марат К ответам на вопрос (4)
@Joysi75
По моему все можно :-) ибо
Я бы делал через subquery (удобно для выборок по разным условиям из составленного "набора" пересечений)
select BSproduct from
  ( -- Список продуктов имеющих черный цвет и малый размер
    select product as BSProduct from
      (
        SELECT  t1.id,  t1.name AS product,  t3.name AS color,  t5.name AS size
          FROM  `product` AS t1
          JOIN `product_color` AS t2 ON t1.id = t2.product_id
          JOIN `color` AS t3 ON t2.color_id = t3.id
          JOIN `product_size` AS t4 ON t1.id = t4.product_id
          JOIN `size` AS t5 ON t4.size_id = t5.id
      ) 
    where color = "black" and size = "S"  
  ) as BlackAndSmallSize, 
  ( -- Список продуктов имеющих черный цвет и средний размер
    select product as BMProduct from
      (
        SELECT  t1.id,  t1.name AS product,  t3.name AS color,  t5.name AS size
          FROM  `product` AS t1
          JOIN `product_color` AS t2 ON t1.id = t2.product_id
          JOIN `color` AS t3 ON t2.color_id = t3.id
          JOIN `product_size` AS t4 ON t1.id = t4.product_id
          JOIN `size` AS t5 ON t4.size_id = t5.id
      ) 
    where color = "black" and size = "M"  
  ) as BlackAndMidSize, 
  ( -- Список продуктов имеющих большой размер
    select product as LProduct from
      (
        SELECT  t1.id,  t1.name AS product,  t3.name AS color,  t5.name AS size
          FROM  `product` AS t1
          JOIN `product_color` AS t2 ON t1.id = t2.product_id
          JOIN `color` AS t3 ON t2.color_id = t3.id
          JOIN `product_size` AS t4 ON t1.id = t4.product_id
          JOIN `size` AS t5 ON t4.size_id = t5.id
      ) 
    where size = "L"  
  ) as LargeSize
where BSProduct=BMProduct and BMProduct=LProduct


Не знаю как насчет MySQL и его форков, в некоторых SQL серверах можно заранее задавать подзапросы типа
(
        SELECT  t1.id,  t1.name AS product,  t3.name AS color,  t5.name AS size
          FROM  `product` AS t1
          JOIN `product_color` AS t2 ON t1.id = t2.product_id
          JOIN `color` AS t3 ON t2.color_id = t3.id
          JOIN `product_size` AS t4 ON t1.id = t4.product_id
          JOIN `size` AS t5 ON t4.size_id = t5.id
      )

с помощью команды WITH - тогда объем текста выборки сократится в разы.
Ответ написан