将MySQL表从一个垂直列转换为多个水平列

时间:2019-05-14 15:17:24

标签: mysql mysql-workbench

我要转换该表

id | main_id       | image
1  | 10            | 52343.jpg   
2  | 10            | 52344.jpg  
3  | 10            | 52345.jpg 
4  | 11            | 52346.jpg   
5  | 11            | 52347.jpg  
6  | 11            | 52348.jpg 
7  | 11            | 52349.jpg   
8  | 12            | 52350.jpg  
9  | 12            | 52351.jpg

要这样:

id | main_id  | image1    | image2    | image3    | image4
1  | 10       | 52343.jpg | 52344.jpg | 52345.jpg |
2  | 11       | 52346.jpg | 52347.jpg | 52348.jpg | 52349.jpg 
3  | 12       | 52350.jpg | 52351.jpg |

目标表必须是水平的,并且每个记录都有单独的列。

1 个答案:

答案 0 :(得分:0)

如果您使用的是MySQL 8+,则可以在此处使用ROW_NUMBER

WITH cte AS (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY main_id ORDER BY id) rn
    FROM yourTable
)

SELECT
    ROW_NUMBER() OVER (ORDER BY main_id) id,
    main_id,
    MAX(CASE WHEN rn = 1 THEN image END) AS image1,
    MAX(CASE WHEN rn = 2 THEN image END) AS image2,
    MAX(CASE WHEN rn = 3 THEN image END) AS image3,
    MAX(CASE WHEN rn = 4 THEN image END) AS image4
FROM cte
GROUP BY
    main_id;

enter image description here

Demo