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笔试题之单列拆分多列查询并合并显示相关推荐

  1. php如何对 mysql 中text类型拆分存入一个数组_PHP、Mysql笔试题

    PHP&MySQL 笔试题 一.选择题 1. php代表什么意思?() A.Hypertext Preprocessor(超文本预处理器) B.Hyperlink Preprocessor(超 ...

  2. MySQL笔试题练习及答案(一)

    第一题 题目描述 查找最晚入职员工的所有信息,为了减轻入门难度,目前所有的数据里员工入职的日期都不是同一天(sqlite里面的注释为–,mysql为comment) CREATE TABLE empl ...

  3. mysql笔试题15道

    (93条消息) mysql笔试题18道_bubbleJessica的博客-CSDN博客 19.列出最低薪资大于1500的各种工作及从事此工作的全部雇员人数 SELECT JOB,COUNT(*) FR ...

  4. mysql+小写字母不对_PHP、Mysql笔试题

    PHP&MySQL 笔试题 一.选择题 1. php代表什么意思?() A.Hypertext Preprocessor(超文本预处理器) B.Hyperlink Preprocessor(超 ...

  5. php mysql笔试题_初级PHP程序员笔试题

    初级PHP程序员笔试题 答题时间:60 – 90分钟 一.基础及程序题(建议使用你擅长的语言:C/C++.PHP.Java) 1.写一个排序算法,可以是冒泡排序或者是快速排序,假设待排序对象是一个维数 ...

  6. mysql 笔试题_MySQL笔试题详解(一)(中等难度)

    有一位学生在找数据分析工作的时候,遇到一个笔试题,内容如下: 现有注册用户表table_user,有两个字段:user_id(用户id).reg_tm(注册时间).有订单表table_order,有三 ...

  7. CSS笔试题: 实现表格首行首列固定和自适应窗口

    今天校招笔试题要求实现一个首行首列固定,宽度自适应窗口变化,但窗口缩小到一定宽度不能再缩小,出现水平滚动条- 当时我写错了,我一时想不起改用什么办法首行首列固定,用绝对定位,父亲相对定位-这样会有很多 ...

  8. MySQL笔试题整理(二)

    一.学生表.班级表 1.学生表:学生编号ID.班级编号c_ID.姓名sname.性别sex.分数score 2.班级表:班级编号cID.班级cname --建表 create table Studen ...

  9. java与mysql笔试题_JAVA和数据库笔试题

    java部分: 选择:1.下面的执行结果: Java代码 public class Test3 { public static void main(String args[]){ int a=222; ...

最新文章

  1. C 语言编程 — 逻辑控制语句
  2. linux 初始化数组,c – 使用initializer_list初始化数组?
  3. 总结SQL Server窗口函数的简单使用
  4. Delphi中TVarRec做为参数的用法
  5. CentOS6.5 将安装光盘作为yum源
  6. PHP面向对象(OOP)编程入门教程
  7. CF724E Goods transportation
  8. Akka相关术语 译《fifteen》
  9. dcopserver出错解决办法
  10. chrome 无法下载文件软件问题
  11. 微生物组对肥胖影响的最新研究分析
  12. MATLAB 图片压缩一简易方法
  13. HTML径向效果,HTML Canvas实现径向渐变效果
  14. 十、RabbitMQ发布确认高级
  15. 什么是惰性求值?(python基础)
  16. 【嵌入式基础】Keil下编译代码并生成HEX文件
  17. 【雷达通信】基于matlab NCP算法SAR回波生成和成像【含Matlab源码 1185期】
  18. zf2 路由跳转方法
  19. 无法启动此程序因为计算机中丢失 xxx.dll
  20. 听了邹欣副总裁的讲座对ai的理解

热门文章

  1. (Visual Navigation)深度图像转点云
  2. 港科讲座 | 听李泽湘教授讲创业故事(创新灼见讲座系列第一期)
  3. 全栈、云原生的数据分析时代已来,我们如何抓住机会?
  4. 论文笔记:Sequence-to-Sequence Knowledge Graph Completion and QuestionAnswering
  5. 踏雪无痕——2017下半年半年总结
  6. ubuntu18将现有系统打包成iso
  7. 【问题解决】PHP 'Internal Server Error,500 error'
  8. 9. Zigbee应用程序框架开发指南 - 属性管理
  9. java继承求三角形圆形面积_java用接口、多态、继承、类计算三角形和矩形周长及面积的方法...
  10. UVA 12897 Decoding Baby Boos 暴力