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;
若已經設置了最大長度, 則結果被截至這個最大長度。