mysql group_concatの使い方と注意点

2148 ワード

group_concatのデフォルトの区切り記号は「,」であり、他の区切り記号に変更するにはSEPARATORを使用して指定します.たとえば、次のようにします.
mysql> SELECT student_id, GROUP_CONCAT(courses_id SEPARATOR '@#$') AS courses FROM student_courses WHERE student_id=2 GROUP BY student_id;

さらに、このグループの値をソートして文字列に接続することもできます.たとえばcourses_id降順で並ぶ:
mysql> SELECT student_id, GROUP_CONCAT(courses_id ORDER BY courses_id DESC) AS courses FROM student_courses WHERE student_id=2 GROUP BY student_id;

1.intフィールドの接続トラップ
groupを使うとconcatの場合は、接続されたフィールドがint型の場合は、必ずcharに変換してつづらなければなりません.そうしないと、実行後(ExecuteScaleまたはSQLの結果を返す方法)にカンマで区切られた列ではなくbyte[]が返されます.この問題はSQLyogなどのツールでは表現できないので、発見しにくいです.
select group_concat(ipaddress) from t_ip         
select group_concat(id) from t_ip   byte[]
select group_concat(CAST(id as char)) from t_dep         
select group_concat(Convert(id , char)) from t_dep         

Cast,convertの使用法:CAST(expr AS type)、CONVERT(expr,type)、CONVERT(expr USING transcoding_name)CAST()およびCONVERT()関数を使用して、あるタイプの値を取得し、別のタイプの値を生成します.このタイプは、BINARY[(N)]CHAR[(N)]DATE DATETIME DECIMAL SIGNED[INTEGER]TIME UNSIGNED[INTEGER]
2.長さトラップ
groupでconcatがフィールドに接続するときは長さの制限があり、どれだけつながっているかではありません.しかし、設定してもいいです.group_concat_max_lenシステム変数を使用すると、許容される最大長を設定できます.プログラムでこの操作を行う構文は、valが符号なし整数であるSET [SESSION | GLOBAL] group_concat_max_len = val;最大長が設定されている場合、結果はこの最大長まで終了する.SQLyogでSET GLOBALグループを実行_concat_max_len=10の後、SQLyogを再度開くと、設定が有効になります.
作業で使用する区切り記号の例:
SELECT GROUP_CONCAT(tu.user_id) AS memberIds,GROUP_CONCAT(u.`user_name`) AS memberNames,GROUP_CONCAT("【",d.dept_name,"】",u.user_name SEPARATOR "、") AS memberDeptName,
		SUM(tu.`read_flag`) AS readNums,
		(COUNT(*)-SUM(tu.`read_flag`)) AS unreadNums,
		SUM(tu.`finish_flag`) AS finishNums,
		(COUNT(*)-SUM(tu.`finish_flag`)) AS unfinishNums 
		FROM hbk_task_user tu 
		INNER JOIN sys_user u ON tu.user_id=u.`user_id` 
		INNER JOIN sys_dept d ON u.`dept_id`=d.dept_id
		WHERE tu.task_id= 59 GROUP BY tu.task_id;

コンテンツ転送元https://blog.csdn.net/qq_33323054/article/details/82696849