Pendahuluan
Kita tahu bahwa di MySQL terdapat fungsi string yang digunakan untuk menggabungkan string yakni dengan fungsi concat(), fungsinya sangat berguna jika diperlukan untuk melakukan penggabungan string dari satu atau lebih kolom atau menambah string baru sebagaimana contoh berikut:
mysql> select concat(kode_matkul, "|", nama_matkul) as "Mata Kuliah" from matkul limit 5;
+-------------------------------------+
| Mata Kuliah |
+-------------------------------------+
| IT-045001|Algoritma Pemrograman 1 A |
| IT-045002|Algoritma Pemrograman 1 B |
| IT-045003|Algoritma Pemrograman 1 C |
| IT-045004|Bahasa Inggris 1 |
| IT-045005|Fisia & Kimia Dasar 1 |
+-------------------------------------+
5 rows in set (0.00 sec)
Dengan demikian kita telah menggabungkan string dari kolom kode_matkul dengan nama_matkul, hanya saja penggabungan yang dilakukan adalah dengan menambahkan data ke kolom baru, lalu bagaimana jika kita ingin menggabungkan data tersebut hanya menjadi satu baris data saja sebagaimana contoh berikut:
+--------+----------------------------+
| mhs_id | Matkul |
+--------+----------------------------+
| 1 | 1,2,3,4,5,6,7,8,9,10,11,12 |
+--------+----------------------------+
1 row in set (0.00 sec)
Dalam contoh diatas kita bisa menggunakan fungsi group_concat yang dapat menggabungkan sekelompok string menjadi satu baris data, walaupun penggunaannya sama seperti concat biasa untuk menggabungkan string namun cara menggunakan fungsi group_concat sedikit berbeda dari concat biasa.
Group_Concat
Fungsi string group_concat pada dasarnya sama seperti concat yakni untuk menggabungkan string hanya pada group_concat akan mengembalikannya menjadi satu baris data (horizontal) sedangkan pada concat biasa akan tetap mengembalikannya dalam representasi kolom (vertikal), adapun format dasar untuk menggunakan group_concat adalah sebagai berikut:
GROUP_CONCAT(
DISTINCT expression
ORDER BY expression
SEPARATOR sep
);
Cara menggunakannya sedikit berbeda dibanding dengan concat biasa yakni kita perlu menambahkan keyword separator dimana tidak seperti concat, separator / pemisah dapat langsung didefinisikan dengan tanda petik dua selain itu kita juga perlu menggunakan distinct, group by ataupun dengan menggunakan klausa where yang membatasi data mana yang ingin ditampilkan karena jika tidak maka semua data dari kolom yang dimasukan dalam fungsi group_concat akan berulang sebanyak data pada tabel tersebut diikuti dengan string yang dihasilkan oleh separator contohnya sebagai berikut:
mysql> select mhs_id, group_concat(matkul_id separator ",") as Matkul from krs;
+--------+--------------------------------+
| mhs_id | Matkul |
+--------+--------------------------------+
| 1 | 1,2,3,4,5,6,7,8,9,10,11,12.... |
+--------+--------------------------------+
1 row in set (0.00 sec)
mysql> select mhs_id, length(group_concat(matkul_id separator ",")) as Matkul from krs;
+--------+--------+
| mhs_id | Matkul |
+--------+--------+
| 1 | 242 |
+--------+--------+
1 row in set (0.04 sec)
Maka untuk mengatasi hal tersebut kita memerlukan klausa distinct, where ataupun group by sebagaimana contoh berikut:
--Dengan Distinct
mysql> select mhs_id, group_concat(distinct matkul_id separator ",") as Matkul from krs;
+--------+----------------------------+
| mhs_id | Matkul |
+--------+----------------------------+
| 1 | 1,2,3,4,5,6,7,8,9,10,11,12 |
+--------+----------------------------+
1 row in set (0.00 sec)
--Dengan klausa where
mysql> select mhs_id, group_concat(matkul_id separator ",") as Matkul from krs where mhs_id = 1;
+--------+----------------------------+
| mhs_id | Matkul |
+--------+----------------------------+
| 1 | 1,2,3,4,5,6,7,8,9,10,11,12 |
+--------+----------------------------+
1 row in set (0.00 sec)
--Dengan group by
mysql> select mhs_id, group_concat(matkul_id separator ",") as Matkul from krs group by mhs_id limit 5;
+--------+----------------------------+
| mhs_id | Matkul |
+--------+----------------------------+
| 1 | 1,2,3,4,5,6,7,8,9,10,11,12 |
| 2 | 1,2,3,4,5,6,7,8,9,10,11,12 |
| 3 | 1,2,3,4,5,6,7,8,9,10,11,12 |
| 4 | 1,2,3,4,5,6,7,8,9,10,11,12 |
| 5 | 1,2,3,4,5,6,7,8,9,10,11,12 |
+--------+----------------------------+
5 rows in set (0.00 sec)
Selain itu kita juga dapat menambahkan klausa order by untuk mengurutkan data string dari group_concat, contohnya sbeagai berikut:
mysql> select mhs_id, group_concat(distinct matkul_id order by matkul_id DESC separator"") as Matkul from krs;
+--------+-----------------+
| mhs_id | Matkul |
+--------+-----------------+
| 1 | 121110987654321 |
+--------+-----------------+
1 row in set (0.00 sec)
Untuk menambah kondisi dan/atau membatasi data dari group_concat adalah dengan menggunakan subquery setelah klausa from, contohnya sebagai berikut
mysql> select mhs_id, group_concat(matkul_id separator ",") as Matkul from (select mhs_id, matkul_id from krs where mhs_id = 6 and matkul_id > 5 limit 3) as Mats;
+--------+--------+
| mhs_id | Matkul |
+--------+--------+
| 6 | 6,7,8 |
+--------+--------+
1 row in set (0.00 sec)
Penutup
Pada dasarnya fungsi group_concat sama seperti fungsi concat biasa yakni untuk menggabungkan string hanya saja fungsi group_concat akan mengembalikan hasilnya menjadi satu baris data sedangkan concat akan tetap mengembalikan hasilnya dalam bentuk kolom atau menurun kebawah.