Mysql案例之GROUP_CONCAT函数详解

Hello,大家好,我是灰小猿,一个超会写bug的程序员!

今天这篇文章记录一个最近开发中遇到的mysql实战场景,觉得还挺典型的,就在此做一下记录。

先看一下举例场景:

mysql中学生表与学科表通过关联表建立关联,学生和学科为多对多的关系,现要求查询学生的数据,并根据学生表引用的多个学科中名称排列在前的学科的名称进行排序,

数据库表结构如下:

CREATE DATABASE school;

USE school;

CREATE TABLE student (
  id INT AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(50),
  age INT
);

CREATE TABLE course (
  id INT AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(50),
  description VARCHAR(128)
);

CREATE TABLE student_subject_rel (
  id INT AUTO_INCREMENT PRIMARY KEY,
  student_id INT,
  course_id INT
);

数据如下:

先来分析一下需求:首先是要求查询学生表中的数据,那么学生表就是作为主表,同时要求对查询结果进行排序,排序的要求是:以学生表中关联的多条学科数据中,学科名称排列在前的那个学科名称为依据对学生数据进行排序,

举个例子来说:

小王选了B课程和C课程

小李选了E课程和F课程

小张选了A课程和D课程

那么最终显示的结果就是:小张、小王、小李

对于这种情况,我们一般想到的是先根据学生表和关联表,找到每一个学生关联的所有学科,然后对每一个学生的学科进行排序,取到排列在第一位的学科,之后再根据第一次排序得到的学科名对学生进行排序,上面这种逻辑固然能够解决问题,但是使用不够简洁。

今天我们介绍一下另一种方法,采用GROUP_CONCAT 函数的方式来解决,只需要对学科完成一次排序即可。

首先我们来看一下GROUP_CONCAT 函数的含义:

GROUP_CONCAT函数

在 MySQL 中,GROUP_CONCAT 函数用于将查询结果按指定顺序连接成一个字符串。通常结合 GROUP BY 子句一起使用,可以将同一组的多个字段值连接成一个字符串。

以下是 GROUP_CONCAT 函数的基本语法:

SELECT GROUP_CONCAT(column_name ORDER BY order_column SEPARATOR ',') 
FROM table_name 
GROUP BY group_column;
  • column_name:要连接的字段名。

  • order_column:可选,用于指定连接时的排序顺序。

  • SEPARATOR ',':可选,用于指定连接字符串之间的分隔符,默认为逗号(,)。

  • table_name:表名。

  • group_column:分组的字段名。

通过这样的语法,我们可以在查询中使用 GROUP_CONCAT 函数来将查询结果按照指定顺序连接成一个字符串。

下面使用GROUP_CONCAT 函数来解决上述场景问题:

首先以student表为主表,因为学生可能存在没有选课的情况,所以在关联表可能会存在没有关联数据的情况,但是这个时候学生数据也是应该要查询出来的,所以这个时候就需要使用左连接的方式进行连表查询,这样即使学生没有选课,仍然可以将学生的数据查询出来。

因为如果一个学生选择了多门课程的话,有可能会查出多条这个学生的数据,所以这个时候就需要使用GROUP BY根据学生的ID对数据进行分组,

同时使用GROUP_CONCAT 函数将每一个学生选的课程名称拼接成一个字符串作为一个外层排序的字段,并进行升序或降序排列。

最后的结果如下:

SELECT s.*, GROUP_CONCAT(c.name ORDER BY c.name) AS courses
FROM student s
LEFT JOIN student_course_rel r ON s.id = r.student_id 
LEFT JOIN course c ON c.id = r.course_id
GROUP BY s.id
ORDER BY GROUP_CONCAT(c.name ORDER BY c.name) ASC;

执行结果:

如果想要在查询的过程中加入一些其他限定条件,比如搜索等,即可使用如下写法:

SELECT s.*, GROUP_CONCAT(c.name ORDER BY c.name) AS courses
FROM student s
LEFT JOIN student_course_rel r ON s.id = r.student_id 
LEFT JOIN course c ON c.id = r.course_id
WHERE s.name LIKE '%四%'
GROUP BY s.id
ORDER BY GROUP_CONCAT(c.name ORDER BY c.name) ASC; 

执行结果如下:

好了,以上就是GROUP_CONCAT 函数在实战中的一个使用场景总结记录。

我是灰小猿,我们下期见!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/434381.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于springboot的蜗牛兼职网的设计与实现论文

摘 要 随着科学技术的飞速发展,社会的方方面面、各行各业都在努力与现代的先进技术接轨,通过科技手段来提高自身的优势,蜗牛兼职网当然也不能排除在外。蜗牛兼职网是以实际运用为开发背景,运用软件工程原理和开发方法&#xff0c…

Android开发新手入门教程,华为大神花费5个月打造的这份714页学习笔记系列

前言 成为一个专业人士是所有程序员的目标,近几年的工作经历,近距离观察了很多大公司的大佬。有幸与其中的一部分一起工作。在此分享大牛程序员的行为风格以及我自己的所思所想,希望对大家有所帮助。 特此声明:此为我个人主观观点…

Linux学习-二级指针的使用

目录 ###指针传参时要用二级指针 ###函数体内部想要修改函数外部指针变量值的时候需要使用二级指针(指针变量的地址) ###指针传参时要用二级指针 char *str[5]; int Fun(char **ppstr,int len); ###函数体内部想要修改函数外部指针变量值的时候需要使用二级指针(指针变量的…

Docker部署(ruoyi案例接上篇Docker之部署前后端分离项目)实施必会!!!!

文章目录 Docker部署前端 Docker部署前端 接上篇博主已经部署好后端Docker部署后端,现在来讲解怎么部署前端 MySQL和redis是不依赖其他任何一个东西的, ruoyi-admin是因为你启动项目的时候是必须连接数据库的 现在去单独启动它 docker start ruoyi-a…

Java项目:39 springboot008房屋租赁系统

作者主页:舒克日记 简介:Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 房屋租赁系统的设计基于现有的网络平台,主要有管理员、房东、用户三个角色 管理员可以在线查看系统已有的人中心、房屋类型管理、房屋信息…

vue实现虚拟键盘

本文介绍一体机常用的虚拟键盘实现,主打一个免费文章。喜欢就点个赞支持一下吧 simple-keyboard官网:simple-keyboard - simple-keyboard - Francisco HodgeSimple-keyboard is a virtual keyboard for Javascript. You can use it as an input for dev…

[JavaWeb学习日记]JSP+Cookie+Filter与登录+CRUD案例

目录 一.JSP 二.EL表达式与JSTL标签 三.Cookie 四.Session 五.Filter 六. 登录CRUD:品牌增删改查案例 Demo一览 1.导包 2.构建包结构 3.创建数据库表tb_brand与user 4.创建实体类 5.mybatis的配置文件和logback配置文件 6.写接口 7.工具类:生成图片与…

Openfeign+Ribbon+Hystrix断路器(服务降级)

热部署对于Hystrix的热不是不是很明显 所以最好修改代码之后重启服务 简介 在微服务架构中存在多个可直接调用的服务,这些服务若在调用时出现故障会导致连锁效应,也就是可能让整个系统变得不可用,这种情况我们称之为服务雪崩效应. 服务雪崩效应通常发生在微服务架构中&…

【详识JAVA语言】String 类1

String类的重要性 在C语言中已经涉及到字符串了,但是在C语言中要表示字符串只能使用字符数组或者字符指针,可以使用标准库提 供的字符串系列函数完成大部分操作,但是这种将数据和操作数据方法分离开的方式不符合面相对象的思想,而…

SpringCloud微服务-RabbitMQ快速入门

文章目录 RabbitMQ快速入门1、什么是MQ?2、RabbitMQ概述3、RabbitMQ的结构和概念4、常见消息模型5、HelloWorld RabbitMQ快速入门 1、什么是MQ? MQ (MessageQueue),中文是消息队列,字面来看就是存放消息的…

【知识整理】MySQL数据库开发设计规范

一、规范背景与目的 MySQL数据库与 Oracle、 SQL Server 等数据库相比,有其内核上的优势与劣势。我们在使用MySQL数据库的时候需要遵循一定规范,扬长避短。 本规范旨在帮助或指导RD、QA、OP等技术人员做出适合线上业务的数据库设计。在数据库变更和处理…

【LabVIEW FPGA】CIC滤波器

一、CIC滤波器应用概述 在通信数字信号上下变频时,经常会用到对数字信号的升采样和降采样,即通过CIC数字速率器实现变采样率。 二、滤波器IP 首先设置滤波器基本参数(filter specification) 滤波器类型(Filter Type…

裸机编程的几种模式、架构、缺陷

目录 裸机编程模式/架构 1:初始化代码的编写 裸机编程模式/架构 2:轮询模式 裸机编程模式/架构 3:轮询加中断执行模式 裸机编程模式/架构 4:中断定时器主循环的前后台架构 裸机编程模式/架构 5:前后台 状态机架构…

Android开发技巧,最详细的解释小白也能听懂

今天,跟大家聊聊,Framework开发的那些事。 系统应用开发,现在来说,已经开始脱离系统,单独拿出来开发,系统定制接口,已提供给应用调用,用来增强功能。 原生的桌面,拨号&…

C++之获取Windows系统信息

目录 1. 操作系统版本 2. 获取CPU信息 3. 获取内存信息 4. 获取硬盘信息 5.获取网络接口信息 6.获取计算机名称、用户名 在C中,你可以使用Windows API函数来获取Windows系统的各种信息。以下是一些常见的API函数和示例代码,用于获取Windows系统信息…

深入了解 Android 中的 RelativeLayout 布局

RelativeLayout 是 Android 中常用的布局之一&#xff0c;它允许开发者基于子视图之间的相对位置来排列界面元素。在这篇博客中&#xff0c;我们将详细介绍 RelativeLayout 的各种属性&#xff0c;并提供代码示例和解释。 第一个示例 <RelativeLayoutandroid:layout_width…

腾讯云服务器99元一年是真的吗?只要61元!

腾讯云服务器99元一年是真的吗&#xff1f;假的&#xff0c;不要99&#xff0c;只要61元&#xff01;又降价了&#xff01;腾讯云服务器多少钱一年&#xff1f;61元一年起&#xff0c;2核2G3M配置&#xff0c;腾讯云2核4G5M轻量应用服务器165元一年、756元3年&#xff0c;4核16…

数据分析-Pandas数据的直方图探查

数据分析-Pandas数据的直方图探查 数据分析和处理中&#xff0c;难免会遇到各种数据&#xff0c;那么数据呈现怎样的规律呢&#xff1f;不管金融数据&#xff0c;风控数据&#xff0c;营销数据等等&#xff0c;莫不如此。如何通过图示展示数据的规律&#xff1f; 数据表&…

网络编程 24/3/6 作业

1、数据库的增删改 #include <myhead.h> int main(int argc, const char *argv[]) {//定义数据库句柄指针sqlite3 *kdbNULL;//打开数据库&#xff0c;不存在则创建if(sqlite3_open("./my.db",&kdb)!SQLITE_OK){printf("sqlite3_open error\n");…

如何解决无法联网的IP代理问题

目录 前言 一、检查网络连接问题 二、检查IP代理配置问题 三、更换IP代理 四、使用IP池 总结 前言 在进行网络爬虫、数据采集等涉及到频繁请求的操作中&#xff0c;IP代理是一个必不可少的工具。通过使用IP代理&#xff0c;我们可以隐藏真实的IP地址&#xff0c;防止被目…