如何将 MySQL 行转换为 5 列

Posted

技术标签:

【中文标题】如何将 MySQL 行转换为 5 列【英文标题】:How to convert MySQL rows to a column of 5 【发布时间】:2020-09-30 08:02:17 【问题描述】:

我是 mysql 新手。我有一个数据表,我想将其转换为 5 行。

来自SELECT File FROM tbl_file。我有

+--------+
| File   |  
+--------+
| B.jpg  | 
+--------+
| X.jpg  | 
+--------+
| H.png  | 
+--------+
| C.png  | 
+--------+
| A.gif  |
+--------+
| G.pdf  | 
+--------+
| Y.docx | 
+--------+
| U.jpeg | 
+--------+

当行旋转到 5 列时,这是我需要的。

+-------+--------+--------+-------+-------+
| A     | B      | C      | D     | E     |
+-------+--------+--------+-------+-------+
| B.jpg | X.jpg  | H.png  | C.png | A.gif |
+-------+--------+--------+-------+-------+
| G.pdf | Y.docx | U.jpeg |       |       |
+-------+--------+--------+-------+-------+

当第一行被填充到它的限制(5)时,下一行继续被填充。

这是我尝试过的:

SELECT GROUP_CONCAT(File) FROM tbl_file GROUP BY id; 我没有得到我想要得到的东西。

非常感谢。

【问题讨论】:

只在你的应用代码中处理显示逻辑 @strawberry 我的应用程序代码中已经有很多循环。添加它会使其变慢。由于数据库更快,我考虑直接运行它并返回一个表。 【参考方案1】:

这有点难看......但可能。您可以使用窗口函数 - 但您需要一个定义行顺序的列,我假设 id

select
        max(case when rn % 5 = 0 then file end) as filea,
        max(case when rn % 5 = 1 then file end) as fileb,
        max(case when rn % 5 = 2 then file end) as filec,
        max(case when rn % 5 = 3 then file end) as filed,
        max(case when rn % 5 = 4 then file end) as filee
from (
    select t.*, row_number() over(order by id) - 1 rn
    from mytable t
) t
group by floor(rn / 5)

Demo on DB Fiddle

文件 |文件 |文件 |提起 |文件 :---- | :----- | :----- | :---- | :---- B.jpg | X.jpg | .png | C.png | .gif G.pdf | Y.docx | U.jpeg | |

【讨论】:

以上是关于如何将 MySQL 行转换为 5 列的主要内容,如果未能解决你的问题,请参考以下文章

如何动态地将行转换为列,并为每列使用不同的列名

如何将多个重复行转换为列,然后在记事本++中从列转换回行

MySQL 将行转换为动态列

将重复的行转换为mysql中的列

当行大小太大时如何转换MYSQL UTF-8?

MySQL将行转换为动态列数