MySQL - 如何根据另一列中的唯一值转置一列中的单元格?

Posted

技术标签:

【中文标题】MySQL - 如何根据另一列中的唯一值转置一列中的单元格?【英文标题】:MySQL - How To Transpose Cells In One Column Based On Unique Values In Another Column? 【发布时间】:2020-05-01 11:06:30 【问题描述】:

我需要从 Magento 1.9 数据库中获取我们所有的产品类别并将其呈现在一行中,显示我设法获得的“产品 ID”、“产品类型”、“sku”和“类别路径”(ID 和值)以至于我的每个产品的所有类别都以多行形式返回。我当前的查询如下:

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)

它返回以下内容:

我想要达到的目标是这样的:

或者,理想情况下,将这些列合并为一个

有什么建议吗?

【问题讨论】:

请以文本形式附上结果,而不是屏幕截图。 【参考方案1】:

您可以使用条件聚合来旋转您的结果集。

从您现有的查询开始,这里是按产品 ID、产品类型和 sku 分组的方法,并使用类别级别跨列传播类别名称:

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 标准规定单引号用于文字字符串。为您的数据库使用正确的引用字符,或者最好使用不需要引用的别名。

【讨论】:

好的,谢谢。但是,这只会为每个产品返回一个类别。在某些情况下,产品可以属于多个类别。我们如何在不同的行上输出所有类别路径?

以上是关于MySQL - 如何根据另一列中的唯一值转置一列中的单元格?的主要内容,如果未能解决你的问题,请参考以下文章

如何将列中的连接值转置为行

PSQL - 查找所有值并根据另一列中的非唯一值使其唯一

Pandas,对于一列中的每个唯一值,在另一列中获取唯一值

如何将一列的列值组合到 MySQL 中的另一列中?

在python中,我如何对一列中每个值与另一列中的值发生的次数(多少行)建立矩阵?

如何根据bigquery中另一列中的重复值计算一列