mysql将字段转为字符串
mysql中有一个字段,存储文件路径,原来存储路径发生了变化,如何修改呢?把‘d:\alantop_dir\Alantop_Tool\Release\Tools\‘ 修改为 ‘D:\alantop_d...
2024.11.151. 创建测试表及数据
-- 创建一张tb_stu表CREATE TABLE tb_user(id INT PRIMARY KEY AUTO_INCREMENT,NAME VARCHAR(10) COMMENT ‘人名‘,c_no VARCHAR(64) COMMENT ‘持剑ID,以逗号分隔‘);insert INTO tb_user(NAME,c_no) VALUES(‘蘧伯玉‘,‘1,3,5,7‘);insert INTO tb_user(NAME,c_no) VALUES(‘高渐离‘,‘1,2,4,8,5‘);insert INTO tb_user(NAME,c_no) VALUES(‘樗里疾‘,‘2,9‘);insert INTO tb_user(NAME,c_no) VALUES(‘澹台灭明‘,‘1,2‘);insert INTO tb_user(NAME,c_no) VALUES(‘钟子期‘,‘1,2,6,8,7,3,5‘);insert INTO tb_user(NAME,c_no) VALUES(‘柳下惠‘,‘2,4,3,5‘);insert INTO tb_user(NAME,c_no) VALUES(‘百里奚‘,‘1,9‘);insert INTO tb_user(NAME,c_no) VALUES(‘阚止‘,‘1,6,7‘);insert INTO tb_user(NAME,c_no) VALUES(‘霍去病‘,‘1,8,5‘);insert INTO tb_user(NAME,c_no) VALUES(‘慕容白曜‘,‘1,2,3,4,5,7‘);insert INTO tb_user(NAME,c_no) VALUES(‘鱼幼薇‘,‘7,8,9‘);insert INTO tb_user(NAME,c_no) VALUES(‘宋玉‘,‘6,5‘);-- 创建一张剑名create table tb_sword(id int primary key AUTO_INCREMENT,c_name varchar(4)) comment ‘剑名‘;insert into tb_sword(c_name)values(‘轩辕‘);insert into tb_sword(c_name)values(‘湛卢‘);insert into tb_sword(c_name)values(‘赤霄‘);insert into tb_sword(c_name)values(‘太阿‘);insert into tb_sword(c_name)values(‘七星龙渊‘);insert into tb_sword(c_name)values(‘干将‘);insert into tb_sword(c_name)values(‘莫邪‘);insert into tb_sword(c_name)values(‘鱼肠‘);insert into tb_sword(c_name)values(‘纯钧‘);两张表内容如下:
tb_user
tb_sword
2. 数据拆分及合并
需求: 使用一条SQL获得tb_user表中每个人持有的剑名(剑名用“|”分隔),即得到如下结果
拆解需求:
1) 先将tb_user表中的c_no按逗号拆分
2)将拆分后c_no中的各个id与tb_sword中的id关联,获取剑名
3) 最后将每一个user对应的剑名合并成一个字段
分段SQL如下:
步骤1:
每一个user的c_no按逗号拆分为对应的c_id,此方法需借助于mysql.help_topic表
select a.id,a.name,a.c_no, SUBSTRING_INDEX( SUBSTRING_INDEX( a.c_no, ‘,‘, b.help_topic_id + 1 ), ‘,‘,- 1 ) c_idFROM tb_user a JOIN mysql.help_topic b ON b.help_topic_id < ( LENGTH( a.c_no ) - LENGTH( replace ( a.c_no, ‘,‘, ‘‘ ) ) + 1 )ORDER BY a.id结果如下:
步骤2:关联获取每个id对应的剑名
select a2.id,a2.name,a2.c_no,a2.c_id,b2.c_nameFROM (select a.id,a.name,a.c_no, SUBSTRING_INDEX( SUBSTRING_INDEX( a.c_no, ‘,‘, b.help_topic_id + 1 ), ‘,‘,- 1 ) c_idFROM tb_user a JOIN mysql.help_topic b ON b.help_topic_id < ( LENGTH( a.c_no ) - LENGTH( replace ( a.c_no, ‘,‘, ‘‘ ) ) + 1 )ORDER BY a.id) a2, -- a2表即步骤1中拆分的结果tb_sword b2 WHERE a2.c_id =b2.id -- 关联,相当于inner join(或者join)结果如下
步骤3:
将每个人的剑名合并为1个字段显示,并用"|" 符合合并
select a2.id,a2.name,a2.c_no,GROUP_CONCAT(b2.c_name SEPARATOR ‘|‘ ) sword_name-- SEPARATOR 指定分隔富,不加默认为逗号分隔FROM (select a.id,a.name,a.c_no,SUBSTRING_INDEX( SUBSTRING_INDEX( a.c_no, ‘,‘, b.help_topic_id + 1 ), ‘,‘,- 1 ) c_idFROM tb_user aJOIN mysql.help_topic b ON b.help_topic_id < ( LENGTH( a.c_no ) - LENGTH( replace ( a.c_no, ‘,‘, ‘‘ ) ) + 1 )ORDER BY a.id) a2,tb_sword b2WHERE a2.c_id =b2.idGROUP BY a2.id结果如下:
实现需求
mysql中有一个字段,存储文件路径,原来存储路径发生了变化,如何修改呢?把‘d:\alantop_dir\Alantop_Tool\Release\Tools\‘ 修改为 ‘D:\alantop_d...
2024.11.15简介MySQL GROUP_CONCAT()函数将组中的字符串连接成为具有各种选项的单个字符串,也就是实现列的合并。测试创建一个测试表进行测试create table test_classes (st...
2024.11.151.使用unionunion的使用很简单,要做的只是给出每条select语句,在语句之间放上关键字union。(1)我们在products表中查询prod_price
2024.11.06在MySQL数据库中清除重复数据是一项常见的任务。下面将介绍一些去重技巧和策略,以帮助你有效地清除MySQL中的重复数据。1、使用DISTINCT关键字: 最简单的去重方法是使用SELEC T语句的D...
2024.11.15MySQL 默认在表的最后位置添加新字段,如果希望在开头位置(第一列的前面)添加新字段,那么可以使用 FIRST 关键字,语法格式如下:ALTER TABLE ADD [约束条件] FIRST;...
2024.11.15