MYSQL行转列与列转行

本文介绍了MySQL中如何进行行转列和列转行的操作。首先,通过`GROUP_CONCAT`函数展示了如何以id为分组,将name字段的值以逗号或分号分隔显示在同一行。接着,讲解了利用`SUBSTRING_INDEX`函数将字段中的逗号分隔字符串拆分成多行的方法,并给出了完整SQL示例,涉及数据过滤和连接操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

±-----±-----+
| id| name |
±-----±-----+
|1 | 10|
|1 | 20|
|1 | 20|
|2 | 20|
|3 | 200 |
|3 | 500 |
±-----±-----+
6 rows in set (0.00 sec)

一、行转列

1.以id分组,把name字段的值打印在一行,逗号分隔(默认)

select id,group_concat(name) from aa group by id;  

±-----±-------------------+
| id| group_concat(name) |
±-----±-------------------+
|1 | 10,20,20|
|2 | 20 |
|3 | 200,500|
±-----±-------------------+
3 rows in set (0.00 sec)

2.以id分组,把name字段的值打印在一行,分号分隔

select id,group_concat(name separator ';') from aa group by id;  
二、列转行

如果a表去关联b表,希望根据b表中的字段去查询,但是b表中的这个字段是以逗号分割的字符串,想要实现查询必须将这个字段分割。

这个语句是将字段列分割成多行:

SUBSTRING_INDEX(SUBSTRING_INDEX(’字段‘
,',',help_topic_id+1),',',-1) as ’字段‘
FROM b join
    mysql.help_topic 
WHERE 
    help_topic_id < LENGTH(’字段‘)-LENGTH(REPLACE(’字段‘,',',''))+1

以下是完整的sql:

select distinct a.* from log_data_rule a left join (

SELECT b.rule_id,b.rule_type,SUBSTRING_INDEX(SUBSTRING_INDEX(b.data_source
,',',help_topic_id+1),',',-1) as data_source 
FROM log_data_filter_rule b join
    mysql.help_topic 
WHERE 
    help_topic_id < LENGTH(b.data_source)-LENGTH(REPLACE(b.data_source,',',''))+1 and b.is_delete = 0 ) c on a.id = c.rule_id
		
	where a.is_delete = 0  and c.rule_type = 1 and c.data_source = '2'
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值