Mysql笔试题之单列拆分多列查询并合并显示
Mysql笔试题之单列拆分多列查询并合并显示
事情是这样的:某天在开发群里看同行们在聊天,有一位同行发了一个mysql笔试题。抱着试一试的心态研究了几个小时。话不多说直接上题。
题目
有学生表,结构和数据如下图:
CREATE TABLE `student` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,`course` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;
有科目表,结构和数据如下图:
CREATE TABLE `course` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;
要求如下图:
思路
看到这道题的时候首先想到了几个mysql函数GROUP_CONCAT、SEPARATOR 、CONCAT。好像是抓到了什么又好像无从下手。在网上扒拉了很久才解决了问题,因此这篇文章并非纯原创。
分析一下这个题:首先,student表中有三个字段id、name、course。course表中有两个字段id、name。其中student表中的course字段是合并了course表中id的字符串以“,”分割(表名已加粗)。最后,题目要求查询结果包含学生的id、名字、科目id加对应科目名。
分析完之后一个大概的sql框架已经出来了。
SELECTs.id,s.NAME,GROUP_CONCAT(... ...) AS course
FROMstudent s
GROUP BYs.id
GROUP_CONCAT()的作用后续会说明。GROUP_CONCAT中包含的就是主要逻辑了,分割student 表中的course字段并对应course表中的id查出name合并为(course.id.course.name,course.id.course.name)也就是(1. 语文,2. 数学,3. 英语,4. 物理,5. 化学)这种形式。
来个二次分析,怎么才能搞出来这种形式的数据呢?
分割数据肯定要用到SUBSTRING_INDEX(),但是由于sql语句的限制我们没办法像代码中使用for循环来直接循环student表中的course字段。然后我就在网上扒拉了两个小时… …(此处两个省略号代表两个小时)就发现了新大陆。
select substring_index(substring_index('82,83,84,85,86',',',help_topic_id+1),',',-1) as Idfrom mysql.help_topicwhere help_topic_id<(length('82,83,84,85,86')-length(replace('82,83,84,85,86',',',''))+1);
结果是这这样的
原文地址在这里 https://blog.csdn.net/hfsaini/article/details/86477371
芜湖!这不正是我想要的吗!!!
过程
通过发现的新大陆mysql.help_topic配合SUBSTRING_INDEX()就完成了分割student表中的course字段并对应course查询出了name。离成功只差最后一步。
SELECT CONCAT(SUBSTRING_INDEX( SUBSTRING_INDEX( s.course, ',', b.help_topic_id + 1 ), ',',- 1 ),'. ',(
SELECTcourse.NAME
FROMcourse
WHEREcourse.id = SUBSTRING_INDEX( SUBSTRING_INDEX( s.course, ',', b.help_topic_id + 1 ), ',',- 1 ) ) ) FROMstudent sJOIN mysql.help_topic b ON b.help_topic_id < ( LENGTH( s.course ) - LENGTH( REPLACE ( s.course, ',', '' ) ) + 1 )
结果
过程到结果又花了我茫茫多的时间 … …不过总算是弄出来了。
SELECTs.id,s.NAME,GROUP_CONCAT(CONCAT(SUBSTRING_INDEX( SUBSTRING_INDEX( s.course, ',', b.help_topic_id + 1 ), ',',- 1 ),'. ',(
SELECTcourse.NAME
FROMcourse
WHEREcourse.id = SUBSTRING_INDEX( SUBSTRING_INDEX( s.course, ',', b.help_topic_id + 1 ), ',',- 1 ) ) ) SEPARATOR ',' ) AS course
FROMstudent sJOIN mysql.help_topic b ON b.help_topic_id < ( LENGTH( s.course ) - LENGTH( REPLACE ( s.course, ',', '' ) ) + 1 )
GROUP BYs.id
函数说明
这里做一个简单的函数说明
SUBSTRING_INDEX SUBSTRING_INDEX (str,delim,count)
str:要处理的字符串
delim:分隔符
count:计数select SUBSTRING_INDEX("1,2,3,4,5",",",1)
结果为1。如果count是正数,那么就是从左往右数,第N个分隔符的左边的全部内容相反,如果是负数,那么就是从右边开始数,第N个分隔符右边的所有内容。
GROUP_CONCAT(),SEPARATOR
GROUP_CONCAT SEPARATOR 可将查询结果用字符串连接变为一行,需配合使用 GROUP BY
举个栗子:查询打分.打分是两个评委给的分数,每个人的成绩是有两个,但希望查出来的结果是用字符串连接的,变为一行数据
SELECTUSERID, SCORE FROMTBL_SCORE
SELECTGROUP_CONCAT(USERID order by USERID separator ';') userId, SCORE FROMTBL_SCORE GROUP BY userId
举例原文地址 https://blog.csdn.net/linlinlinfeng/article/details/85045557
希望文章能够帮助到大家,二牛与大家共同进步!
Mysql笔试题之单列拆分多列查询并合并显示相关推荐
- php如何对 mysql 中text类型拆分存入一个数组_PHP、Mysql笔试题
PHP&MySQL 笔试题 一.选择题 1. php代表什么意思?() A.Hypertext Preprocessor(超文本预处理器) B.Hyperlink Preprocessor(超 ...
- MySQL笔试题练习及答案(一)
第一题 题目描述 查找最晚入职员工的所有信息,为了减轻入门难度,目前所有的数据里员工入职的日期都不是同一天(sqlite里面的注释为–,mysql为comment) CREATE TABLE empl ...
- mysql笔试题15道
(93条消息) mysql笔试题18道_bubbleJessica的博客-CSDN博客 19.列出最低薪资大于1500的各种工作及从事此工作的全部雇员人数 SELECT JOB,COUNT(*) FR ...
- mysql+小写字母不对_PHP、Mysql笔试题
PHP&MySQL 笔试题 一.选择题 1. php代表什么意思?() A.Hypertext Preprocessor(超文本预处理器) B.Hyperlink Preprocessor(超 ...
- php mysql笔试题_初级PHP程序员笔试题
初级PHP程序员笔试题 答题时间:60 – 90分钟 一.基础及程序题(建议使用你擅长的语言:C/C++.PHP.Java) 1.写一个排序算法,可以是冒泡排序或者是快速排序,假设待排序对象是一个维数 ...
- mysql 笔试题_MySQL笔试题详解(一)(中等难度)
有一位学生在找数据分析工作的时候,遇到一个笔试题,内容如下: 现有注册用户表table_user,有两个字段:user_id(用户id).reg_tm(注册时间).有订单表table_order,有三 ...
- CSS笔试题: 实现表格首行首列固定和自适应窗口
今天校招笔试题要求实现一个首行首列固定,宽度自适应窗口变化,但窗口缩小到一定宽度不能再缩小,出现水平滚动条- 当时我写错了,我一时想不起改用什么办法首行首列固定,用绝对定位,父亲相对定位-这样会有很多 ...
- MySQL笔试题整理(二)
一.学生表.班级表 1.学生表:学生编号ID.班级编号c_ID.姓名sname.性别sex.分数score 2.班级表:班级编号cID.班级cname --建表 create table Studen ...
- java与mysql笔试题_JAVA和数据库笔试题
java部分: 选择:1.下面的执行结果: Java代码 public class Test3 { public static void main(String args[]){ int a=222; ...
最新文章
- C 语言编程 — 逻辑控制语句
- linux 初始化数组,c – 使用initializer_list初始化数组?
- 总结SQL Server窗口函数的简单使用
- Delphi中TVarRec做为参数的用法
- CentOS6.5 将安装光盘作为yum源
- PHP面向对象(OOP)编程入门教程
- CF724E Goods transportation
- Akka相关术语 译《fifteen》
- dcopserver出错解决办法
- chrome 无法下载文件软件问题
- 微生物组对肥胖影响的最新研究分析
- MATLAB 图片压缩一简易方法
- HTML径向效果,HTML Canvas实现径向渐变效果
- 十、RabbitMQ发布确认高级
- 什么是惰性求值?(python基础)
- 【嵌入式基础】Keil下编译代码并生成HEX文件
- 【雷达通信】基于matlab NCP算法SAR回波生成和成像【含Matlab源码 1185期】
- zf2 路由跳转方法
- 无法启动此程序因为计算机中丢失 xxx.dll
- 听了邹欣副总裁的讲座对ai的理解
热门文章
- (Visual Navigation)深度图像转点云
- 港科讲座 | 听李泽湘教授讲创业故事(创新灼见讲座系列第一期)
- 全栈、云原生的数据分析时代已来,我们如何抓住机会?
- 论文笔记:Sequence-to-Sequence Knowledge Graph Completion and QuestionAnswering
- 踏雪无痕——2017下半年半年总结
- ubuntu18将现有系统打包成iso
- 【问题解决】PHP 'Internal Server Error,500 error'
- 9.	Zigbee应用程序框架开发指南 - 属性管理
- java继承求三角形圆形面积_java用接口、多态、继承、类计算三角形和矩形周长及面积的方法...
- UVA 12897 Decoding Baby Boos 暴力