Postgres. Внутреннее соединение с 1 ко многим - PullRequest
0 голосов
/ 25 февраля 2020

нужна ваша помощь. У меня есть 3 таблицы

продукты | id | название | цена | .... |

product_to_category_list | id | product_id | category_id |

и «категории» | id | cat_title |

Для каждого продукта в таблице "products" может быть связано много строк в "product_to_category_list", потому что один продукт может быть связан с различными категориями одновременно.

Мне нужен запрос получить все продукты, связанные с несколькими определенными категориями + дополнительный столбец со всеми категориями для этого продукта, разделенными запятыми.

Например, Мне нужен продукт, который связан с двумя категориями (3 и 5): (product_to_category_list.category_id = 3 и product_to_category_list.category_id = 5)

select 
"products"."id", "title", "manufacturer", "amount", "price", 
"photo", "description", "available", "valid_until", "weight",
array_to_string(array_agg(product_to_category_list.category_id), ',') as category_id


from "products" inner join "product_to_category_list" on "products"."id" = "product_to_category_list"."product_id" 
where (category_id = 5 ) and 
(select 
count("title") from "products" inner join "product_to_category_list" on "products"."id" = "product_to_category_list"."product_id" 
 where (category_id =3)  ) >0


group by "products"."id"

ScreenShot 1 Он возвращает мне Почти результат, который мне нужен Но: 1) category_id содержит только значение 5 2) запрос генерирует динамически, и это может быть 3-5 категорий для одного продукта в качестве условия, и я не уверен, что 5 внутренних выборок - хорошая идея.


Я разработал другой запрос:

select p.title,p.manufacturer, p.amount,p.price,p.photo,p.description, p.available, p.valid_until,p.weight, 
array_to_string(array_agg(c.category_id), ',') as cats_id
      from products p
      INNER JOIN product_to_category_list c ON c.product_id = p.id [[[where cats_id like "%paramCat_1%" and cats_id like "%paramCat_2%" ....  ]]]]
      group by p.id 

Возвращает: Снимок экрана 2

И снова это почти то, что мне нужно, но я не могу используйте новый псевдоним с условием «Где и как», чтобы сравнить его с моими категориями.

Итак, как мне получить одну строку со всеми данными по продуктам и со всеми категориями из product_to_category_list.category_id, разделенными с products.id, разделенными запятыми (в дополнительном поле)

Надеюсь на вашу помощь;)

1 Ответ

0 голосов
/ 25 февраля 2020

Вы можете использовать отбор из таблицы product_to_category_list, чтобы получить список идентификаторов продуктов, которые вам нужны, и присоединить свой запрос к этому.

SELECT p.title,p.manufacturer, p.amount,p.price,p.photo,p.description, p.available, p.valid_until,p.weight,
array_to_string(array_agg(c.category_id), ',') AS cats_id
FROM products p
INNER JOIN product_to_category_list c 
    ON c.product_id = p.id 
INNER JOIN (SELECT DISTINCT product_id FROM WP.product_to_category_list WHERE category_id IN (3,5) ) c_limit
    ON c_limit.product_id = p.id
GROUP BY p.title,p.manufacturer, p.amount,p.price,p.photo,p.description, p.available, p.valid_until,p.weight
...