@VKhotey

Как объединить данные в sql join запросе?

У меня есть 2 таблицы связанные с собою много ко многим, к примеру категории и продукты

3 таблица осуществляет связь между ними, когда пишу join запрос то продукты у которых 2 и более категории дублируются 2 и более раз соответсвенно, как решить эту проблему ? Отдельно выбирать продукты и категории, а потом их мапить ?

const _products = await knex('products')
  .select(
    'products.name as productName',
    'products.id as productId',
    'categories.id as categoryId',
    'products.url as productUrl',
    'categories.url as categoryUrl',
    'categories.name as categoryName'
  )
  .leftJoin(
    'categories_products',
    'categories_products.product_id',
    '=',
    'products.id'
  )
  .leftJoin(
    'categories',
    'categories.id',
    '=',
    'categories_products.category_id'
  )


Ответ:
[
  {
            "productName": "natus",
            "productId": 1,
            "categoryId": 6,
            "productUrl": "http://june.com-natus",
            "categoryUrl": "caps",
            "categoryName": "Шапки"
        },
        {
            "productName": "natus",
            "productId": 1,
            "categoryId": 4,
            "productUrl": "http://june.com-natus",
            "categoryUrl": "jackets",
            "categoryName": "Куртки"
        },
]


Получится должно так, но для этого я отдельно выбираю категоии и продукты и потом в цикле их собираю:
[
{
            "id": 1,
            "name": "natus",
            "url": "http://june.com-natus",
            "description": "Ipsam id dolores et suscipit illo. Magnam eveniet enim laborum omnis sint iste quo deserunt omnis. Exercitationem eum beatae atque animi qui iusto eos ipsam sint. Omnis consequatur suscipit beatae dolores illo rem soluta voluptatem sit. Aliquam et sit repellendus.\n \rModi distinctio suscipit tempora est eius vel fuga dolore. Voluptates alias vel qui iste nihil voluptatem quas error culpa. Facere illum sunt qui.\n \rNon in ut aut blanditiis nam. Ad qui aut aut voluptate nulla. Enim quia impedit ipsam perferendis expedita magnam nisi qui eligendi. Esse tempore est exercitationem alias omnis voluptatem non tenetur rem. Ut porro animi molestiae. Eveniet ducimus et voluptatem dolores hic eum.",
            "imageUrl": "http://lorempixel.com/640/480/abstract",
            "enabled": 1,
            "price": "404.97",
            "categories": [
                {
                    "id": 6,
                    "category_id": 6,
                    "product_id": 1,
                    "name": "Шапки",
                    "url": "caps",
                    "enabled": 1
                },
                {
                    "id": 4,
                    "category_id": 4,
                    "product_id": 1,
                    "name": "Куртки",
                    "url": "jackets",
                    "enabled": 1
                }
            ],
            "options": []
        },
]


И тот же вопрос когда связь к 1му

Запрос:
const _category = knex('categories')
      .select(
        'categories.name as categoriesName',
        'categories.url as categoriesUrl',
        'products.name as productName',
        'products.url as productUrl'
      )
      .leftJoin(
        'categories_products',
        'categories_products.category_id',
        '=',
        'categories.id'
      )
      .leftJoin(
        'products',
        'products.id',
        '=',
        'categories_products.product_id'
      )
      .where('categories.id', id)


Ответ:
[
        {
            "categoriesName": "Куртки",
            "categoriesUrl": "jackets",
            "productName": "dolores",
            "productUrl": "https://dominic.com-dolores"
        },
        {
            "categoriesName": "Куртки",
            "categoriesUrl": "jackets",
            "productName": "dolores",
            "productUrl": "http://crawford.name-dolores"
        },
        {
            "categoriesName": "Куртки",
            "categoriesUrl": "jackets",
            "productName": "natus",
            "productUrl": "http://june.com-natus"
        }
]
  • Вопрос задан
  • 73 просмотра
Пригласить эксперта
Ответы на вопрос 2
LaRN
@LaRN
Senior Developer
Попробуйте напрямую такой запрос выполнить на базе, будут ли дублирования.

select pr.id as productId,
pr.name as productName,
pr.url as productUrl,
ct.id as categoryId,
ct.url as categoryUrl
ct.name as categoryName
from products as pr
inner join categories_products as ctp
on ctp.product_id = pr.id
inner join categories as ct
on ct.id = ctp.category_id

Возможно в таблице categories_products по product_id есть несколько записей.
Ответ написан
@viras777
Правильно вам запрос отработал. Вы описали ситуацию, но не задали вопрос, что именно хотите в результате получить? Например, в первом случае выдаётся 2 записи, одна лишняя, так добавьте ограничение в where у запроса по тем полям, где лишняя строка. И потом, почему сразу join, а не where?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы