Mysql連結カラム(group_concat)
3293 ワード
GROUP_CONCAT()はMySQLデータベースが提供する関数で、通常GROUP BYと一緒に使用されます.具体的にはMySQL公式サイトを参照してください.
http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat構文:GROUP_CONCAT([DISTINCT] expr [,expr ...] [ORDER BY {unsigned_integer | col_name | expr} [ASC |DESC] [,col_name ...]] [SEPARATOR str_val])
1.例:
SELECT student_id, GROUP_CONCAT(courses_id) AS courses FROM student_courses WHERE student_id=2GROUP BY student_id;
+------------+---------+
| student_id | courses |
+------------+---------+
| 2 | 3,4,5 |
+------------+---------+
phpサイクルは必要ありません
$row = $pdo->query("SELECT student_id, GROUP_CONCAT(courses_id) AS courses FROM student_courses WHERE student_id=2 GROUP BY student_id"); $result = explode(',', $row['courses']);
2.もちろん、区切り文字はカスタマイズできますが、デフォルトでは「,」を区切り文字として使用します.「||||」に変更するには、SEPARATORを使用して指定します.たとえば、SELECT student_id, GROUP_CONCAT(courses_id SEPARATOR '|||') AS courses FROM student_coursesWHERE student_id=2 GROUP BY student_id; +------------+---------+
| student_id | courses |
+------------+---------+
| 2 | 3|||4|||5 |
+------------+---------+
3.それ以外に、このグループの値を並べ替えて文字列に接続することもできます.例えばcourses_id降順で並ぶ:
SELECT student_id, GROUP_CONCAT(courses_id ORDER BY courses_id DESC) AS courses FROMstudent_courses WHERE student_id=2 GROUP BY student_id;
+------------+---------+
| student_id | courses |
+------------+---------+
| 2 | 5,4,3 | +------------+---------+
4.注意する必要がある:a.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]b.長さトラップ用group_concat後、selectでlimitを使うと役に立たない.group_concatがフィールドに接続するときは長さの制限があり、どれだけつながっているかではありません.しかし、設定してもいいです.group_の使用concat_max_lenシステム変数は、許容される最大長を設定できます.プログラムでこの操作を行う構文は、valが符号なし整数であるSET[SESSION|GLOBAL]group_concat_max_len = val; 最大長が設定されている場合、結果はこの最大長まで終了します.SQLyogでSET GLOBALグループを実行_concat_max_len=10の後、SQLyogを再度開くと、設定が有効になります.まとめ:
①デフォルトの「,」を区切り記号として使用しない場合は、separatorを追加する必要があります.
②接続文字参照のソートorder by
推奨事項:
oracleでこのような関数:wm_concat
http://blog.csdn.net/xb12369/article/details/24347767
http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat構文:GROUP_CONCAT([DISTINCT] expr [,expr ...] [ORDER BY {unsigned_integer | col_name | expr} [ASC |DESC] [,col_name ...]] [SEPARATOR str_val])
1.例:
SELECT student_id, GROUP_CONCAT(courses_id) AS courses FROM student_courses WHERE student_id=2GROUP BY student_id;
+------------+---------+
| student_id | courses |
+------------+---------+
| 2 | 3,4,5 |
+------------+---------+
phpサイクルは必要ありません
$row = $pdo->query("SELECT student_id, GROUP_CONCAT(courses_id) AS courses FROM student_courses WHERE student_id=2 GROUP BY student_id"); $result = explode(',', $row['courses']);
2.もちろん、区切り文字はカスタマイズできますが、デフォルトでは「,」を区切り文字として使用します.「||||」に変更するには、SEPARATORを使用して指定します.たとえば、SELECT student_id, GROUP_CONCAT(courses_id SEPARATOR '|||') AS courses FROM student_coursesWHERE student_id=2 GROUP BY student_id; +------------+---------+
| student_id | courses |
+------------+---------+
| 2 | 3|||4|||5 |
+------------+---------+
3.それ以外に、このグループの値を並べ替えて文字列に接続することもできます.例えばcourses_id降順で並ぶ:
SELECT student_id, GROUP_CONCAT(courses_id ORDER BY courses_id DESC) AS courses FROMstudent_courses WHERE student_id=2 GROUP BY student_id;
+------------+---------+
| student_id | courses |
+------------+---------+
| 2 | 5,4,3 | +------------+---------+
4.注意する必要がある:a.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]b.長さトラップ用group_concat後、selectでlimitを使うと役に立たない.group_concatがフィールドに接続するときは長さの制限があり、どれだけつながっているかではありません.しかし、設定してもいいです.group_の使用concat_max_lenシステム変数は、許容される最大長を設定できます.プログラムでこの操作を行う構文は、valが符号なし整数であるSET[SESSION|GLOBAL]group_concat_max_len = val; 最大長が設定されている場合、結果はこの最大長まで終了します.SQLyogでSET GLOBALグループを実行_concat_max_len=10の後、SQLyogを再度開くと、設定が有効になります.まとめ:
①デフォルトの「,」を区切り記号として使用しない場合は、separatorを追加する必要があります.
②接続文字参照のソートorder by
select distinct(t.COUNTRY),GROUP_CONCAT(t.CARDTYPE ORDER BY CARDTYPE desc SEPARATOR '/') from km_gm_common t where 1=1 GROUP BY COUNTRY order by convert(country using gbk) asc ;
推奨事項:
oracleでこのような関数:wm_concat
http://blog.csdn.net/xb12369/article/details/24347767