1. 程式人生 > >mysql函數GROUP_CONCAT()

mysql函數GROUP_CONCAT()

cast AR 使用 type cas 信息 數據 第一條 mysql

mysql 中 GROUP_CONCAT()函數,主要用來處理一對多的查詢結果,通常會結合GROUP BY一起使用。

語法:

GROUP_CONCAT([DISTINCT] expr [,expr ...]

             [ORDER BY {unsigned_integer | col_name | expr}

                 [ASC | DESC] [,col_name ...]]

             [SEPARATOR str_val])

測試數據:

學生表(student)

技術分享圖片

課程表(course)

技術分享圖片

學生選課表(stu_course)

技術分享圖片

1. 查詢所有學生的選課信息

SELECT
    s.stu_id            AS  studentId,
    s.stu_name       AS  studentName,
    c.course_id       AS  courseId,
    c.course_name  AS  studentCourse
FROM
    student s
LEFT JOIN
    stu_course sc
ON
    s.stu_id = sc.stu_id
LEFT JOIN
    course c
ON sc.course_id = c.course_id

結果:

技術分享圖片

使用GROUP_CONCAT()函數將結果分組歸集:

SELECT
    s.stu_id          AS  studentId,
    s.stu_name     AS  studentName,
    GROUP_CONCAT(c.course_id)    AS  courseId,
    GROUP_CONCAT(c.course_name)  AS  studentCourse
FROM
    student s
LEFT JOIN
    stu_course sc
ON s.stu_id = sc.stu_id LEFT JOIN course c ON sc.course_id = c.course_id GROUP BY studentId

結果:

技術分享圖片

使用GROUP_CONCAT時會將數值類型的數據轉化成二進制BLOB類型,可以用CAST(expr AS type)函數或CONVERT(expr, type)函數將數值類型的數據轉化成字符串:

SELECT
    s.stu_id          AS  studentId,
    s.stu_name     AS  studentName,
    GROUP_CONCAT(CAST(c.course_id AS CHAR))     AS  courseId,
    GROUP_CONCAT(c.course_name)  AS  studentCourse
FROM
    student s
LEFT JOIN
    stu_course sc
ON
    s.stu_id = sc.stu_id
LEFT JOIN
    course c
ON
    sc.course_id = c.course_id
GROUP BY
    studentId

結果:

技術分享圖片

2. 若要將第一條記錄中courseId按照從小到大的方式歸集,則可以在使用GROUP_CONCAT() 時加上ORDER BY :

SELECT
    s.stu_id          AS  studentId,
    s.stu_name     AS  studentName,
    GROUP_CONCAT(CAST(c.course_id AS CHAR) ORDER BY c.course_id) AS courseId,
    GROUP_CONCAT(c.course_name)  AS  studentCourse
FROM
    student s
LEFT JOIN
    stu_course sc
ON
    s.stu_id = sc.stu_id
LEFT JOIN
    course c
ON
    sc.course_id = c.course_id
GROUP BY
    studentId

結果:

技術分享圖片

但我們發現,雖然courseId這一列的數據按照從小到大的順序排序了,但另一列studentCourse對應的數據卻並沒有跟著變,這也算是GROUP_CONCAT的一個缺點了。若有人知曉如何讓另一列也跟著變,還請不吝告知。

3. 改變分隔符。

GROUP_CONCAT默認的分隔符是逗號(”,”),若想換成其他分隔符,可以用 SEPARATOR關鍵字:

SELECT
    s.stu_id          AS  studentId,
    s.stu_name     AS  studentName,
    GROUP_CONCAT(CAST(c.course_id AS CHAR) ORDER BY c.course_id SEPARATOR /)    AS  courseId,
    GROUP_CONCAT(c.course_name SEPARATOR |)   AS  studentCourse
FROM
    student s
LEFT JOIN
    stu_course sc
ON
    s.stu_id = sc.stu_id
LEFT JOIN
    course c
ON
    sc.course_id = c.course_id
GROUP BY
    studentId

結果:

技術分享圖片

4. GROUP_CONCAT長度限制

用了GROUP_CONCAT後,SELECT裏如果使用了LIMIT是不起作用的.

用GROUP_CONCAT連接字段的時候是有長度限制的,並不是有多少連多少。但可以設置一下。

使用group_concat_max_len系統變量,可以設置允許的最大長度。

語法如下,其中 val 是一個無符號整數:

SET [SESSION | GLOBAL] group_concat_max_len = val;

若已經設置了最大長度, 則結果被截至這個最大長度。

轉: https://www.cnblogs.com/meikaiyipian/p/5450658.html

mysql函數GROUP_CONCAT()