mysql函數GROUP_CONCAT()


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

語法:

1 GROUP_CONCAT([DISTINCT] expr [,expr ...]
2 
3              [ORDER BY {unsigned_integer | col_name | expr}
4 
5                  [ASC | DESC] [,col_name ...]]
6 
7              [SEPARATOR str_val])

 

測試數據:

學生表(student)

課程表(course)

學生選課表(stu_course)

 

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

 1 SELECT
 2     s.stu_id            AS  studentId,
 3     s.stu_name       AS  studentName,
 4     c.course_id       AS  courseId,
 5     c.course_name  AS  studentCourse
 6 FROM
 7     student s
 8 LEFT JOIN
 9     stu_course sc
10 ON
11     s.stu_id = sc.stu_id
12 LEFT JOIN
13     course c
14 ON
15     sc.course_id = c.course_id

 

結果:

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

 1 SELECT
 2     s.stu_id          AS  studentId,
 3     s.stu_name     AS  studentName,
 4     GROUP_CONCAT(c.course_id)    AS  courseId,
 5     GROUP_CONCAT(c.course_name)  AS  studentCourse
 6 FROM
 7     student s
 8 LEFT JOIN
 9     stu_course sc
10 ON
11     s.stu_id = sc.stu_id
12 LEFT JOIN
13     course c
14 ON
15     sc.course_id = c.course_id
16 GROUP BY
17     studentId

 

結果:

 

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

 1 SELECT
 2     s.stu_id          AS  studentId,
 3     s.stu_name     AS  studentName,
 4     GROUP_CONCAT(CAST(c.course_id AS CHAR))     AS  courseId,
 5     GROUP_CONCAT(c.course_name)  AS  studentCourse
 6 FROM
 7     student s
 8 LEFT JOIN
 9     stu_course sc
10 ON
11     s.stu_id = sc.stu_id
12 LEFT JOIN
13     course c
14 ON
15     sc.course_id = c.course_id
16 GROUP BY
17     studentId

結果:

 

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

 1 SELECT
 2     s.stu_id          AS  studentId,
 3     s.stu_name     AS  studentName,
 4     GROUP_CONCAT(CAST(c.course_id AS CHAR) ORDER BY c.course_id) AS courseId,
 5     GROUP_CONCAT(c.course_name)  AS  studentCourse
 6 FROM
 7     student s
 8 LEFT JOIN
 9     stu_course sc
10 ON
11     s.stu_id = sc.stu_id
12 LEFT JOIN
13     course c
14 ON
15     sc.course_id = c.course_id
16 GROUP BY
17     studentId

結果:

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

 

3. 改變分隔符。

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

 1 SELECT
 2     s.stu_id          AS  studentId,
 3     s.stu_name     AS  studentName,
 4     GROUP_CONCAT(CAST(c.course_id AS CHAR) ORDER BY c.course_id SEPARATOR '/')    AS  courseId,
 5     GROUP_CONCAT(c.course_name SEPARATOR '|')   AS  studentCourse
 6 FROM
 7     student s
 8 LEFT JOIN
 9     stu_course sc
10 ON
11     s.stu_id = sc.stu_id
12 LEFT JOIN
13     course c
14 ON
15     sc.course_id = c.course_id
16 GROUP BY
17     studentId

結果:

 

4. GROUP_CONCAT長度限制

用了GROUP_CONCAT后,SELECT里如果使用了LIMIT是不起作用的.

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

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

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

SET [SESSION | GLOBAL] group_concat_max_len = val;

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM