TransWikia.com

Дублируются значения при использовании нескольких JOIN (извлечение данных при нескольких связях многие ко многим) PostgreSQL

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.

Поля в таблицах:

  1. products – id, name (остальные не имеют значение, упрощаем задачу =) )
  2. colors – id, colorcolor указывается сам цвет, например, зелёный)
  3. colors – id, sizesize указывается сам размер, например, XL)
  4. products_to_colors – id, color_id, product_id
  5. 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

One Answer

Вы умножаете между собой записи из 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

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP