最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Mysql案例之GROUP_CONCAT函數(shù)的具體使用

 更新時(shí)間:2025年05月29日 10:20:09   作者:灰小猿  
本文詳細(xì)的介紹了MySQL中學(xué)生與學(xué)科多對(duì)多關(guān)聯(lián)場(chǎng)景下的排序問題,通過GROUP_CONCAT函數(shù)結(jié)合左連接和分組,一次性獲取每個(gè)學(xué)生首個(gè)學(xué)科名稱并排序,感興趣的可以了解一下

今天這篇文章記錄一個(gè)最近開發(fā)中遇到的mysql實(shí)戰(zhàn)場(chǎng)景,覺得還挺典型的,就在此做一下記錄。

先看一下舉例場(chǎng)景:

mysql中學(xué)生表與學(xué)科表通過關(guān)聯(lián)表建立關(guān)聯(lián),學(xué)生和學(xué)科為多對(duì)多的關(guān)系,現(xiàn)要求查詢學(xué)生的數(shù)據(jù),并根據(jù)學(xué)生表引用的多個(gè)學(xué)科中名稱排列在前的學(xué)科的名稱進(jìn)行排序,

數(shù)據(jù)庫表結(jié)構(gòu)如下:

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
);

數(shù)據(jù)如下:

先來分析一下需求:首先是要求查詢學(xué)生表中的數(shù)據(jù),那么學(xué)生表就是作為主表,同時(shí)要求對(duì)查詢結(jié)果進(jìn)行排序,排序的要求是:以學(xué)生表中關(guān)聯(lián)的多條學(xué)科數(shù)據(jù)中,學(xué)科名稱排列在前的那個(gè)學(xué)科名稱為依據(jù)對(duì)學(xué)生數(shù)據(jù)進(jìn)行排序,

舉個(gè)例子來說:

小王選了B課程和C課程

小李選了E課程和F課程

小張選了A課程和D課程

那么最終顯示的結(jié)果就是:小張、小王、小李

對(duì)于這種情況,我們一般想到的是先根據(jù)學(xué)生表和關(guān)聯(lián)表,找到每一個(gè)學(xué)生關(guān)聯(lián)的所有學(xué)科,然后對(duì)每一個(gè)學(xué)生的學(xué)科進(jìn)行排序,取到排列在第一位的學(xué)科,之后再根據(jù)第一次排序得到的學(xué)科名對(duì)學(xué)生進(jìn)行排序,上面這種邏輯固然能夠解決問題,但是使用不夠簡(jiǎn)潔。

今天我們介紹一下另一種方法,采用GROUP_CONCAT 函數(shù)的方式來解決,只需要對(duì)學(xué)科完成一次排序即可。

首先我們來看一下GROUP_CONCAT 函數(shù)的含義:

GROUP_CONCAT函數(shù)

在 MySQL 中,GROUP_CONCAT 函數(shù)用于將查詢結(jié)果按指定順序連接成一個(gè)字符串。通常結(jié)合 GROUP BY 子句一起使用,可以將同一組的多個(gè)字段值連接成一個(gè)字符串。

以下是 GROUP_CONCAT 函數(shù)的基本語法:

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

  • order_column:可選,用于指定連接時(shí)的排序順序。

  • SEPARATOR ',':可選,用于指定連接字符串之間的分隔符,默認(rèn)為逗號(hào)(,)。

  • table_name:表名。

  • group_column:分組的字段名。

通過這樣的語法,我們可以在查詢中使用 GROUP_CONCAT 函數(shù)來將查詢結(jié)果按照指定順序連接成一個(gè)字符串。

下面使用GROUP_CONCAT 函數(shù)來解決上述場(chǎng)景問題:

首先以student表為主表,因?yàn)閷W(xué)生可能存在沒有選課的情況,所以在關(guān)聯(lián)表可能會(huì)存在沒有關(guān)聯(lián)數(shù)據(jù)的情況,但是這個(gè)時(shí)候?qū)W生數(shù)據(jù)也是應(yīng)該要查詢出來的,所以這個(gè)時(shí)候就需要使用左連接的方式進(jìn)行連表查詢,這樣即使學(xué)生沒有選課,仍然可以將學(xué)生的數(shù)據(jù)查詢出來。

因?yàn)槿绻粋€(gè)學(xué)生選擇了多門課程的話,有可能會(huì)查出多條這個(gè)學(xué)生的數(shù)據(jù),所以這個(gè)時(shí)候就需要使用GROUP BY根據(jù)學(xué)生的ID對(duì)數(shù)據(jù)進(jìn)行分組,

同時(shí)使用GROUP_CONCAT 函數(shù)將每一個(gè)學(xué)生選的課程名稱拼接成一個(gè)字符串作為一個(gè)外層排序的字段,并進(jìn)行升序或降序排列。

最后的結(jié)果如下:

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;

執(zhí)行結(jié)果:

如果想要在查詢的過程中加入一些其他限定條件,比如搜索等,即可使用如下寫法:

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; 

執(zhí)行結(jié)果如下:

好了,以上就是GROUP_CONCAT 函數(shù)在實(shí)戰(zhàn)中的一個(gè)使用場(chǎng)景總結(jié)記錄。

到此這篇關(guān)于Mysql案例之GROUP_CONCAT函數(shù)的具體使用的文章就介紹到這了,更多相關(guān)Mysql GROUP_CONCAT函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • mysql中WITH的多種用法與常見示例

    mysql中WITH的多種用法與常見示例

    這篇文章主要介紹了mysql中WITH的多種用法與常見示例,MySQL中的WITH語句,也稱為公用表表達(dá)式(CTE),用于定義臨時(shí)結(jié)果集,可以在查詢中重復(fù)引用,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-02-02
  • my.cnf(my.ini)重要參數(shù)優(yōu)化配置說明

    my.cnf(my.ini)重要參數(shù)優(yōu)化配置說明

    本文針對(duì)mysql不同存儲(chǔ)引擎,MyISAM與Innodb進(jìn)行了講解如何進(jìn)行my.cnf(my.ini)的參數(shù)優(yōu)化
    2018-03-03
  • 使用mysql的disctinct group by查詢不重復(fù)記錄

    使用mysql的disctinct group by查詢不重復(fù)記錄

    非常不錯(cuò)的方法,用mysql的group by解決不重復(fù)記錄的問題,看來我需要學(xué)習(xí)的地方太多了
    2008-08-08
  • Mysql 5.7.17 解壓版(ZIP版)安裝步驟詳解

    Mysql 5.7.17 解壓版(ZIP版)安裝步驟詳解

    MySQL 社區(qū)版 5.7.17 發(fā)布了,MySQL 是一個(gè)關(guān)系型數(shù)據(jù)庫管理系統(tǒng),由瑞典 MySQL AB 公司開發(fā),目前屬于 Oracle 旗下產(chǎn)品,是最流行的關(guān)系型數(shù)據(jù)庫管理系統(tǒng)。下面這篇文章主要介紹了Mysql 5.7.17 解壓版的安裝步驟,并且介紹了可能會(huì)遇到的坑,需要的朋友可以參考下。
    2017-01-01
  • 圖文詳解mysql中with...as用法

    圖文詳解mysql中with...as用法

    這篇文章主要給大家介紹了關(guān)于mysql中with...as用法的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用mysql具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2022-01-01
  • MySQL全文索引觸發(fā)OOM案例分析

    MySQL全文索引觸發(fā)OOM案例分析

    這篇文章主要介紹了MySQL全文索引觸發(fā)OOM案例分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-01-01
  • mysql中DCL常用的用戶和權(quán)限控制

    mysql中DCL常用的用戶和權(quán)限控制

    這篇文章主要介紹了mysql中DCL常用的用戶和權(quán)限控制,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-03-03
  • mysql8查看鎖信息

    mysql8查看鎖信息

    MYSQL中有一個(gè)重要的特性就是鎖,下面這篇文章主要給大家介紹了關(guān)于mysql8查看鎖信息的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2023-06-06
  • driver-class-name:?com.mysql.jdbc.Driver爆紅的問題解決

    driver-class-name:?com.mysql.jdbc.Driver爆紅的問題解決

    在springboot項(xiàng)目工程中想要進(jìn)行數(shù)據(jù)庫配置,driver-class-name:?com.mysql.cj.jdbc.Driver始終報(bào)錯(cuò),本文就來介紹一下如何解決,感興趣的可以了解一下
    2024-07-07
  • Django+mysql配置與簡(jiǎn)單操作數(shù)據(jù)庫實(shí)例代碼

    Django+mysql配置與簡(jiǎn)單操作數(shù)據(jù)庫實(shí)例代碼

    這篇文章主要介紹了Django+mysql配置與簡(jiǎn)單操作數(shù)據(jù)庫實(shí)例,需要的朋友可以參考下
    2017-07-07

最新評(píng)論

交城县| 平利县| 革吉县| 凤冈县| 锡林浩特市| 中牟县| 平谷区| 宁化县| 万荣县| 宁武县| 石狮市| 裕民县| 崇文区| 乌审旗| 钦州市| 大安市| 鄂伦春自治旗| 厦门市| 白沙| 百色市| 昆明市| 通海县| 阳江市| 琼结县| 辰溪县| 集贤县| 铁力市| 武鸣县| 黄石市| 札达县| 叙永县| 武山县| 同仁县| 新宾| 长海县| 湖南省| 罗源县| 苍梧县| 巴塘县| 宜宾县| 天门市|