mysql如何将行结果转换为具有新列名的列?

时间:2020-06-10 16:59:37

标签: mysql sql join pivot window-functions

我有2个要加入的mysql表,但我希望“类别”列的结果位于新列而不是行中。

第一个看起来像这样

table name = petshop.product
|==========================|
|product_id | product_name |
|==========================|
|     1     | Dog & Cat Toy|
|     2     | Dog Food     |
|==========================|

第二个看起来像这样

table name = petshop.category
|============================|
|category_id | category_name |
|============================| 
|      1     |Dog            |
|      2     |Food           |
|      3     |Toy            |
|      4     |Cat            | 
|============================|        

我还有另一个表来存储看起来像这样的关系

table name = petshop.product_category
=================================
|pc_id| product_id | category_id|
|===============================|
|  1  |     1      |      1     |
|  2  |     1      |      3     |
|  3  |     1      |      4     |
|  4  |     2      |      1     |
|  5  |     2      |      2     |
|===============================|

我如何输出结果看起来像这样的表

|====================================================|
|product_name|  category1  |  category2 |  category3 |
|====================================================|
|Dog&Cat Toy |  Dog        | Toy        | Cat        |
|Dog Food    |  Dog        | Food       | NULL       |
|====================================================|

我读到有关数据透视的内容,但我无法绕过它(说实话,这对mysql和编码来说确实是全新的)。 谢谢!

1 个答案:

答案 0 :(得分:0)

在MySQL 8.0中,您可以通过联接,row_number()来枚举每个产品的类别,并通过条件聚合来枢转结果集:

select 
    product_name,
    max(case when rn = 1 then category_name end) category1,
    max(case when rn = 2 then category_name end) category2,
    max(case when rn = 3 then category_name end) category3
from (
    select 
        p.product_id,
        p.product_name,
        c.category_name,
        row_number() over(partition by p.product_id order by c.category_id) rn
    from product p
    inner join product_category pc on pc.product_id = p.product_id
    inner join category c on c.category_id = pc.category_id
) t
group by product_id, product_name
相关问题