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 函数在实战中的一个使用场景总结记录。

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

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据库-ODBC操作

承接Qt/C软件开发项目,高质量交付,灵活沟通,长期维护支持。需求所寻,技术正适,共创完美,欢迎私信联系! 一、ODBC 数据源配置 打开ODBC数据源管理器: 在Windows搜索栏中键入“ODBC数…

PTA L2-011 玩转二叉树

给定一棵二叉树的中序遍历和前序遍历,请你先将树做个镜面反转,再输出反转后的层序遍历的序列。所谓镜面反转,是指将所有非叶结点的左右孩子对换。这里假设键值都是互不相等的正整数。 输入格式: 输入第一行给出一个正整数N&…

草稿111

peekmessage&#xff08;用于接受信息&#xff09; exmessage&#xff08;专门用于鼠标操作&#xff09; #include<graphics.h> #include<string> #include<vector> using namespace std; const int WINDOW_WIDTH 1280; const int WINDOW_HEIGHT 720;//封装…

LoadRunner VS RunnerGo:主流性能测试工具对比谁更胜一筹?

LoadRunner作为性能测试工具的开拓者&#xff0c;测试人员应该都听过&#xff0c;可能也用过&#xff0c;相比较后起之秀Jmeter&#xff0c;使用场景更趋于企业级的性能测试&#xff0c;不太适合个人使用。 RunnerGo呢&#xff0c;是一款基于Go语言、国产自研的测试平台。它支…

NCDA设计大赛中设定画命题解读

一年一度的未来设计师全国高校数字艺术设计大赛&#xff08;NCDA&#xff09;正在如火如荼的进行中&#xff0c;各高校的大学生和指导老师们也都在着手准备中。今天我们就特地来说说它的数字绘画命题之一的设定画选项&#xff0c;为了使大家更好地参加本次比赛&#xff0c;本文…

CTP-API开发系列之三:柜台系统简介

CTP-API开发系列之三&#xff1a;柜台系统简介 CTP-API开发系列之三&#xff1a;柜台系统简介中国金融市场结构---交易所柜台系统通用柜台系统极速柜台系统主席与次席 CTP柜台系统CTP组件名称对照表CTP柜台系统程序包CTP柜台系统架构图 CTP-API开发系列之三&#xff1a;柜台系统…

2.5K Star,打造个性化博客平台

2.5K Star&#xff0c;打造个性化博客平台 Hi&#xff0c;骚年&#xff0c;我是大 G&#xff0c;公众号「GitHub 指北」会推荐 GitHub 上有趣有用的项目&#xff0c;一分钟 get 一个优秀的开源项目&#xff0c;挖掘开源的价值&#xff0c;欢迎关注。 导语 在当今的信息时代&a…

3.7练习题解

一共五道题&#xff1a; 1. PERKET&#xff1a; 观察容易发现n的值很小&#xff0c;所以我们可以考虑使用dfs的方法进行解答&#xff0c;首先我们可以考虑一共有n种配料&#xff0c;那么我们就可以考虑到可以选择1到n种配料数目&#xff0c;然后基于这个思路我们再对其进行判断…

任务调度新境界:探秘ScheduledExecutorService的异步魔力

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 任务调度新境界&#xff1a;探秘ScheduledExecutorService的异步魔力 前言ScheduledExecutorService的基本概念基本概念&#xff1a;为何它是 Java 中任务调度的首选工具&#xff1a;基本用法&#xf…

MySQL-查询SQL语句的执行过程:连接器->查询缓存(8就没了)->分析器->优化器->执行器->返回结果

MySQL-查询SQL语句的执行过程&#xff1a;连接器->查询缓存<8就没了>->分析器->优化器->执行器->返回结果 查询SQL语句的执行过程1、主要步骤2、实用案例 查询SQL语句的执行过程 1、主要步骤 在MySQL中&#xff0c;一条查询SQL语句的执行过程非常复杂且…

day14_异常

今日内容 零、 复习昨日 一、日期类 二、异常 零、 复习昨日 1为什么要重写toString Object类toString返回的是对象名字地址,无意义子类重写toString() 返回的对象属性内容 2为什么要重写equals Object类equals判断是对象的地址值是否相等,无意义子类重写equals,为了判断对象的…

如何写一份简单的产品说明书,教程奉上

如果你是一位新晋产品经理&#xff0c;或者正在研发新产品&#xff0c;并且心中惴惴不安因为未知的产品说明书制作环节&#xff0c;那么今天你就来对地方了。本篇文章将教你如何创建一份简单明了的产品说明书。让我们开始吧&#xff01; 首先&#xff0c;明确产品说明书的目标。…