Дублируются значения при использовании нескольких JOIN (извлечение данных при нескольких связях многие ко многим) PostgreSQL
Уже 3 вопрос по одному SQL запросу, но постоянно возникают новые проблемы =).
Входные данные: PostgreSQL. Есть 5 таблиц: products, colors, sizes, products_to_colors, products_to_sizes. Связь многие ко многим - каждый продукт может иметь несколько цветов и несколько размеров. Каждый цвет и размер может быть у нескольких продуктов. Связь между цветами, размерами и продуктами реализована с помощью 2 таблиц products_to_colors, products_to_sizes.
Поля в таблицах:
- products -
id,name(остальные не имеют значение, упрощаем задачу =) ) - colors -
id,color(вcolorуказывается сам цвет, например, зелёный) - colors -
id,size(вsizeуказывается сам размер, например,XL) - products_to_colors -
id,color_id,product_id - products_to_colors -
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
Ответы (1 шт):
Вы умножаете между собой записи из 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