MySQL - Как переставить ячейки в одной колонке на основе уникальных значений в другой колонке? - PullRequest
1 голос
/ 01 мая 2020

Мне нужно получить все наши категории продуктов из базы данных Magento 1.9 и представить их в одной строке, показывая «ID продукта», «Тип продукта», «Sku» и «Путь к категории» (идентификаторы и значения), которые мне удалось получить. до точки, где все мои категории для каждого продукта возвращаются в несколько строк. Мой текущий запрос ниже:

SELECT 
    p.entity_id AS 'product_id',
    p.type_id AS 'product_type',
    p.sku,
    c.category_id,
    l.level AS 'category_level',
    l.path AS 'category_path',
    n.name AS 'category_name'
FROM
    mage_catalog_product_entity AS p
        JOIN
    mage_catalog_category_product_index AS c ON p.entity_id = c.product_id
        JOIN
    mage_catalog_category_entity AS l ON l.entity_id = c.category_id
        JOIN
    mage_catalog_category_flat_store_6 AS n ON n.path = l.path
WHERE
    c.store_id = '6' 
        AND l.path LIKE '1/14%'
        AND l.path NOT LIKE '1/14/207%'
        AND l.path NOT LIKE '1/14/12/25%'
        -- AND l.level > 1
ORDER BY p.sku , length(l.path)

Он возвращает следующее:

current query result screenshot

Я пытаюсь добиться чего-то подобного:

desired query result screenshot

Или, в идеале, ОБЪЕДИНИТЬ эти столбцы в один

ideal query result screenshot

Есть предложения?

1 Ответ

0 голосов
/ 01 мая 2020

Вы можете изменить свой набор результатов с помощью условного агрегирования.

Начиная с существующего запроса, здесь предлагается подход, который группирует по идентификатору продукта, типу продукта и артикулу и использует уровень категории для распределения названий категорий по столбцам:

SELECT 
    p.entity_id AS product_id,
    p.type_id AS product_type,
    p.sku,
    max(l.level) AS category_level,
    max(l.path) AS category_path,
    max(case when l.level = 1 then n.name end) AS level1_category_name,
    max(case when l.level = 2 then n.name end) AS level2_category_name,
    max(case when l.level = 3 then n.name end) AS level3_category_name,
    max(case when l.level = 4 then n.name end) AS level4_category_name
FROM
    mage_catalog_product_entity AS p
        JOIN
    mage_catalog_category_product_index AS c ON p.entity_id = c.product_id
        JOIN
    mage_catalog_category_entity AS l ON l.entity_id = c.category_id
        JOIN
    mage_catalog_category_flat_store_6 AS n ON n.path = l.path
WHERE
    c.store_id = '6' 
        AND l.path LIKE '1/14%'
        AND l.path NOT LIKE '1/14/207%'
        AND l.path NOT LIKE '1/14/12/25%'
GROUP BY product_id, p.entity_id, p.sku
ORDER BY p.sku

Примечание. : не используйте одинарные кавычки для псевдонимов столбцов; в то время как некоторые базы данных могут поддерживать это, стандарт SQL гласит, что одинарные кавычки предназначены для буквенных строк. Используйте правильный символ цитирования для вашей базы данных или, еще лучше, используйте псевдонимы, которые не требуют цитирования.

...