mysql函數GROUP_CONCAT()
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 cON 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 scON 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()