mysql数据库行转列

问题

例:学生表 和 老师表。
原始设计时没有关联表,使用“,”隔开表示关联关系

Student

idnameteacherIds
1小明1,3,4
2小红2,3,4

Teacher

idnamelesson
1张三数学
2李四数学
3王五语文
4赵六英语

转换
StudentTecherRelation

idstudentIdteacherId
111
213
314
422
423
424

解决

1. 创建自增表

使用sql关联查询笛卡尔积特性,生成1-1000的自增表(如果需要10000,在添加一个表t4)

DROP TABLE IF EXISTS tmp_generator1000;
CREATE TABLE IF NOT EXISTS tmp_generator1000
( id INT ( 11 ) NOT NULL ,
PRIMARY KEY ( `id` ) USING BTREE );

INSERT INTO tmp_generator1000
SELECT @v := @v + 1 AS id 
FROM
(SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 10) t1,
(SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 10) t2,
(SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 10) t3,
(SELECT @v := 0) t0;
2. 使用函数SUBSTRING_INDEX分割teacherIds字段

注意,位置,做去空处理

INSERT INTO student_teacher_relation ( studentId, teacherId ) 
SELECT studentId, teacherId
FROM(
SELECT
student.id AS studentId,
SUBSTRING_INDEX(SUBSTRING_INDEX(student.teacherIds, ',', num.id), ',',- 1 ) AS teacherId
FROM
	( SELECT id, teacherIds FROM student ) student
	JOIN tmp_generator1000 num 
WHERE
	num.id < LENGTH(student.teacherIds) - LENGTH(REPLACE(student.teacherIds, ',', '' )) + 2) relation 
WHERE relation.teacherId <> ''; 
-- 删除 自增表
DROP TABLE IF EXISTS tmp_generator1000;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值