±-----±-----+
| 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'