如何使用MySQL实现行转列,将类型对应的路径拆分为多列?
问题描述
完成关联操作与条件过滤后,得到如下数据表:
| 名称(Name) | 类型(Type) | 路径(Path) |
|---|---|---|
| Item 1 | mobile | /mobile/image1.jpg |
| Item 1 | desktop | /desktop/image1.jpg |
| Item 2 | mobile | /mobile/image2.jpg |
| Item 2 | desktop | /desktop/image2.jpg |
期望最终得到如下结构的结果表:
| 名称(Name) | 移动端路径(Path mobile) | 桌面端路径(Path desktop) |
|---|---|---|
| Item 1 | /mobile/image1.jpg | /desktop/image1.jpg |
| Item 2 | /mobile/image2.jpg | /desktop/image2.jpg |
请问可以使用MySQL的什么特性实现该数据转换?目前只能在调用请求的代码中进行数据映射处理。
解决方案
可以使用MySQL的条件聚合(结合CASE WHEN语句与聚合函数)实现这种行转列的数据转换,无需在代码层处理数据映射。
具体SQL实现
SELECT `名称(Name)`, MAX(CASE WHEN `类型(Type)` = 'mobile' THEN `路径(Path)` END) AS `移动端路径(Path mobile)`, MAX(CASE WHEN `类型(Type)` = 'desktop' THEN `路径(Path)` END) AS `桌面端路径(Path desktop)` FROM 你的目标数据表名 GROUP BY `名称(Name)`;
逻辑说明
CASE WHEN语句会根据类型(Type)的取值,筛选出对应端的路径值,不匹配的行返回NULL- 通过
GROUP BY 名称(Name)将同一名称的多行数据分组 - 使用
MAX()聚合函数(也可使用MIN(),因为每个名称对应唯一的移动端/桌面端路径),自动忽略分组内的NULL值,最终将分组内的多行数据合并为一行,得到对应端的路径
如果使用MySQL 8.0及以上版本,也可以借助JSON相关函数实现,但条件聚合是兼容性更强的通用方案,适配所有主流MySQL版本。
内容的提问来源于stack exchange,提问作者Ilya Weber
相关产品推荐
相关产品推荐

