MySQL 一列数据拆分并查询对应数据后合并为一行

功能:MySQL 将一列数据进行根据分隔符进行拆分后查询对应数据并合并为一行。

效果:将答题表text列根据逗号分割为每个选项,根据选项到答题选项表查询对应选项数据option_text后合并为一行拼接(格式 选项+. +选项内容)。

一、数据处理

1. 答题表数据(存放答题信息)

2. 答题选项表数据(存放答题选项信息)

3. 效果图

3.1 实现代码

SELECT 
	a.answer_id, a.text,
	GROUP_CONCAT(
		CONCAT(
			SUBSTRING_INDEX(SUBSTRING_INDEX(a.text, ',', b.help_topic_id + 1), ',' ,- 1), # 得到当前选项
			'. ',
			(
				SELECT answer_option.option_text 
				FROM answer_option 
				WHERE answer_option.option_key = 
					SUBSTRING_INDEX(SUBSTRING_INDEX(a.text, ',', b.help_topic_id + 1), ',' ,- 1) # 得到当前选项
			) # 查询当前选项对应的值
		) SEPARATOR '     ' # 间隔符
	) AS result
FROM answer a
JOIN mysql.help_topic b ON b.help_topic_id < (LENGTH(a.text) - LENGTH(REPLACE (a.text, ',', '')) + 1)
GROUP BY answer_id

3.2 使用函数介绍

# 函数介绍
# SUBSTRING_INDEX 截取
# 	例:SUBSTRING_INDEX('a,b,c,d',',',2) 结果 a,b
#	例:SUBSTRING_INDEX('a,b,c',',',-1) 结果 c  注意:负数从后开始算
# CONCAT 拼接字符串
# 	例:CONCAT('A',',', '选项a') 结果 A. 选项a
# 	例:CONCAT('C',',', '选项c') 结果 C. 选项c
# GROUP_CONCAT 将group by产生的同一个分组中的值连接起来,返回一个字符串结果
# SEPARATOR 配合 GROUP_CONCAT 使用 合并成一行且在两值中间拼接字符
# mysql.help_topic 一个系统表,这里用来当索引使用
# LENGTH 计算长度
# 	例:LENGTH('a,b,c') 结果 5
# 	例:LENGTH('abc') 结果 3
# GROUP BY 分组
#	例:GROUP BY answer_id 根据answer_id进行分组

 

二、建表语句

1. 答题表.sql

DROP TABLE IF EXISTS `answer`;
CREATE TABLE `answer` (
  `answer_id` int(255) NOT NULL AUTO_INCREMENT COMMENT '答题id',
  `text` varchar(255) DEFAULT NULL COMMENT '答题内容',
  PRIMARY KEY (`answer_id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COMMENT='答题表';
INSERT INTO `answer` VALUES ('1', 'A,D');
INSERT INTO `answer` VALUES ('2', 'D,C');
INSERT INTO `answer` VALUES ('3', 'B,C,A');

2. 答案选项表.sql

DROP TABLE IF EXISTS `answer_option`;
CREATE TABLE `answer_option` (
  `option_id` int(255) NOT NULL AUTO_INCREMENT COMMENT '选项id',
  `option_key` varchar(255) DEFAULT NULL COMMENT '选项',
  `option_text` varchar(255) DEFAULT NULL COMMENT '内容',
  PRIMARY KEY (`option_id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;
INSERT INTO `answer_option` VALUES ('1', 'A', '选项a');
INSERT INTO `answer_option` VALUES ('2', 'B', '选项b');
INSERT INTO `answer_option` VALUES ('3', 'E', '选项e');
INSERT INTO `answer_option` VALUES ('4', 'D', '选项d');
INSERT INTO `answer_option` VALUES ('5', 'C', '选项c');
INSERT INTO `answer_option` VALUES ('6', 'F', '选项f');

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值