Stack Overflow на русском Asked by Inventor on December 27, 2020
Уже 3 вопрос по одному SQL запросу, но постоянно возникают новые проблемы =).
Входные данные: PostgreSQL. Есть 5 таблиц: products
, colors
, sizes
, products_to_colors
, products_to_sizes
. Связь многие ко многим – каждый продукт может иметь несколько цветов и несколько размеров. Каждый цвет и размер может быть у нескольких продуктов. Связь между цветами, размерами и продуктами реализована с помощью 2 таблиц products_to_colors
, products_to_sizes
.
Поля в таблицах:
id
, name
(остальные не имеют значение, упрощаем задачу =) )id
, color
(в color
указывается сам цвет, например, зелёный)id
, size
(в size
указывается сам размер, например, XL
)id
, color_id
, product_id
id
, size_id
, product_id
Мне нужно достать данные из этих таблиц и получить модели товаров. Пробовал использовать такой запрос:
SELECT
products.*,
string_agg(colors.color, ',') AS colors,
string_agg(sizes.size, ',') AS sizes
FROM products
LEFT JOIN products_to_colors ON products.id = products_to_colors.product_id
LEFT JOIN colors ON colors.id = products_to_colors.color_id
LEFT JOIN products_to_sizes ON products.id = products_to_sizes.product_id
LEFT JOIN sizes ON sizes.id = products_to_sizes.size_id
GROUP BY products.id
В ответе от postgres значения sizes и colors продублированы, т.е.:
"id": 4,
"name": "test",
"colors": "белый,желтый,белый,желтый",
"sizes": "38,38,48,48"
Почему это происходит и как я могу это исправить?
P.S. Ещё есть таблицы images
с картинками (связь многие к одному – 1 товар, несколько картинок.), и products_to_products
(в ней сохраняются похожие продукты). Их тоже буду использовать в запросе, пробовал их тоже в запросе использовать, тогда значения выводятся по 4 раза, а не по 2
Вы умножаете между собой записи из products_to_colors
и products_to_sizes
, отсда и повторы. Делайте оба подзапросами примерно так:
(select string_agg(colors.color, ',')
from products_to_colors
JOIN colors ON colors.id = products_to_colors.color_id
where products.id = products_to_colors.product_id) as colors
Correct answer by Anatoly on December 27, 2020
Get help from others!
Recent Answers
Recent Questions
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP