Contoh Implementasi Fungsi GROUP_CONCAT MySQL

Dimisalkan Saya memiliki 3 buah tabel yaitu tabel user_profile, field_kelas, dan mapel_kelas_ajar.

  1. Tabel kelas ajar berisi nama – nama guru beserta kelas ajarnya dan setiap guru itu bisa memiliki banyak kelas ajar.
  2. Tabel kelas berisi nama – nama kelas
  3. Tabel profile berisi daftar nama – nama guru

Jika misalnya saya ingin menampilkan daftar nama guru beserta daftar kelas ajarnya dengan cara biasa tanpa GROUP_CONCAT() maka akan ada tampilan duplikasi seperti berikut

Baca juga : Melakukan Pengurutan Berdasarkan Data Terbanyak di MySQL

Database changed
MariaDB [sikola]> SELECT id_ajar, nama_lengkap, nama_kelas FROM mapel_kelas_ajar
    -> LEFT JOIN user_profile ON user_profile.uid=mapel_kelas_ajar.id_guru
    -> LEFT JOIN field_kelas ON field_kelas.id_kelas = mapel_kelas_ajar.id_kelas
    -> ORDER by nama_kelas;
+---------+----------------------------+------------+
| id_ajar | nama_lengkap               | nama_kelas |
+---------+----------------------------+------------+
|      19 | Dede Heryanto, S.Pd., M.Pd | 10 A       |
|      46 | Karmana, S.Pd              | 10 A       |
|      73 | Hari Hidayat.,S.Ag         | 10 A       |
|      16 | Drs.Nanang Suganda         | 10 A       |
|      37 | Euis Nurhidayah, S.Eng     | 10 A       |
|      64 | Mukarom, S.Pd              | 10 A       |
|      28 | Dedeh, S.Pd                | 10 A       |
|      92 | Agus Fazri.,S.Ag           | 10 A       |
|      55 | Hermana,S.Pd               | 10 A       |
|      82 | Suherman Juanda, S.Pd.I    | 10 A       |
|      29 | Dedeh, S.Pd                | 10 B       |
|      93 | Agus Fazri.,S.Ag           | 10 B       |
|      56 | Hermana,S.Pd               | 10 B       |
|      83 | Suherman Juanda, S.Pd.I    | 10 B       |
|      20 | Dede Heryanto, S.Pd., M.Pd | 10 B       |
|      47 | Karmana, S.Pd              | 10 B       |

Jadi terlihat bahwa hasil dari query diatas, menampilkan tampilan data yang kurang efisien karena terjadi duplikat nama – nama kelas beserta gurunya, padahal jika secara logika, kita bisa menampilkan 1 nama gurunya, kemudian menampilkan daftar kelas ajar dibagian samping atau sebalikanya, menampilkan daftar kelas kemudian daftar nama – nama pengajar di kelas tersebut


Menampilkan daftar kelas kemudian daftar nama – nama pengajar di kelas

MariaDB [sikola]> SELECT nama_kelas, GROUP_CONCAT(nama_lengkap,' / ') AS 'Guru Pengajar' FROM mapel_kelas_ajar
    -> LEFT JOIN field_kelas ON mapel_kelas_ajar.id_kelas=field_kelas.id_kelas
    -> LEFT JOIN user_profile ON mapel_kelas_ajar.id_guru=user_profile.uid
    -> GROUP by nama_kelas;
+------------+------------------------------------------------------------------------------------------------------
| nama_kelas | Guru Pengajar
+------------+------------------------------------------------------------------------------------------------------
| 10 A       | Dede Heryanto, S.Pd., M.Pd / ,Euis Nurhidayah, S.Eng / ,Hermana,S.Pd / ,Drs.Nanang Suganda / ,Hari Hi
| 10 B       | Suherman Juanda, S.Pd.I / ,Dede Heryanto, S.Pd., M.Pd / ,Euis Nurhidayah, S.Eng / ,Hermana,S.Pd / ,Dr
| 10 C       | Dedeh, S.Pd / ,Karmana, S.Pd / ,Mukarom, S.Pd / ,Suherman Juanda, S.Pd.I / ,Dede Heryanto, S.Pd., M.P
| 11 A       | Hari Hidayat.,S.Ag / ,Drs. Yusa Rizal / ,Agus Fazri.,S.Ag / ,Dedeh, S.Pd / ,Karmana, S.Pd / ,Mukarom,
| 11 B       | Dede Heryanto, S.Pd., M.Pd / ,Adin Permana, S.Pd, M.Pd / ,Hermana,S.Pd / ,Hari Hidayat.,S.Ag / ,Drs.
| 11 C       | Karmana, S.Pd / ,Mukarom, S.Pd / ,Suherman Juanda, S.Pd.I / ,Dede Heryanto, S.Pd., M.Pd / ,Adin Perma
| 12 A       | Dedeh, S.Pd / ,Karmana, S.Pd / ,Drs. Yusa Rizal / ,Mukarom, S.Pd / ,Suherman Juanda, S.Pd.I / ,Dede H
| 12 B       | Adin Permana, S.Pd, M.Pd / ,Hermana,S.Pd / ,Hari Hidayat.,S.Ag / ,Agus Fazri.,S.Ag / ,Dedeh, S.Pd / ,
| 12 C       | Dede Heryanto, S.Pd., M.Pd / ,Dedeh, S.Pd / ,Adin Permana, S.Pd, M.Pd / ,Hermana,S.Pd / ,Hari Hidayat
+------------+------------------------------------------------------------------------------------------------------


Menampilkan daftar guru kemudian daftar kelas ajarnya

MariaDB [sikola]> SELECT nama_lengkap AS 'Guru Pengajar', GROUP_CONCAT(nama_kelas,' ') AS 'Daftar Kelas ajar' FROM mapel_kelas_ajar
    -> LEFT JOIN field_kelas ON mapel_kelas_ajar.id_kelas=field_kelas.id_kelas
    -> LEFT JOIN user_profile ON mapel_kelas_ajar.id_guru=user_profile.uid
    -> GROUP by nama_lengkap;
+----------------------------+-------------------------------------------------------------+
| Guru Pengajar              | Daftar Kelas ajar                                           |
+----------------------------+-------------------------------------------------------------+
| Adin Permana, S.Pd, M.Pd   | 12 B ,11 B ,12 C ,11 C ,12 A ,11 A                          |
| Agus Fazri.,S.Ag           | 11 A ,12 B ,11 B ,12 C ,10 A ,11 C ,10 C ,10 B ,12 A        |
| Dede Heryanto, S.Pd., M.Pd | 10 A ,11 B ,12 C ,10 B ,11 C ,10 C ,12 A ,12 C ,11 A ,12 B  |
| Dedeh, S.Pd                | 10 C ,12 A ,12 C ,11 A ,12 B ,10 A ,11 B ,10 B ,11 C        |
| Drs. Yusa Rizal            | 11 A ,12 A ,11 B ,12 B ,11 C ,12 C                          |
| Drs.Nanang Suganda         | 10 A ,10 B ,10 C                                            |
| Euis Nurhidayah, S.Eng     | 10 A ,10 B ,10 C                                            |
| Hari Hidayat.,S.Ag         | 11 A ,12 B ,10 A ,11 B ,12 C ,10 B ,11 C ,10 C ,12 A        |
| Hermana,S.Pd               | 12 B ,10 A ,11 B ,12 C ,10 B ,11 C ,10 C ,12 A ,11 A        |
| Karmana, S.Pd              | 11 C ,10 C ,12 A ,11 A ,12 B ,10 A ,11 B ,12 C ,10 B        |
| Mukarom, S.Pd              | 11 C ,10 C ,12 A ,11 A ,12 B ,10 A ,11 B ,12 C ,10 B        |
| Suherman Juanda, S.Pd.I    | 10 B ,11 C ,10 C ,12 A ,11 A ,12 B ,10 A ,11 B ,12 C        |
+----------------------------+-------------------------------------------------------------+
12 rows in set (0.00 sec)

Bila diperhatikan bahwa hasil dari query diatas masih sedikit kurang tapi bukan dari segi bagaimana data disajikan tetapi dari segi bagaimana urutan pada GROUP_CONCAT ditampilkan karena nilainya tidak terurut secara leksikal

MariaDB [sikola]> SELECT nama_lengkap AS 'Guru Pengajar', GROUP_CONCAT(DISTINCT(nama_kelas)) AS 'Daftar Kelas ajar' FROM mapel_kelas_ajar
    -> LEFT JOIN field_kelas ON mapel_kelas_ajar.id_kelas=field_kelas.id_kelas
    -> LEFT JOIN user_profile ON mapel_kelas_ajar.id_guru=user_profile.uid
    -> GROUP by nama_lengkap;

Contoh Implementasi Fungsi GROUP_CONCAT MySQL

Sekarang bisa dilihat bahwa tambahan fungsi DISINCT bukan hanya sekedar untuk menghapus duplikasi tetapi juga mampu mengurutkan data secara leksikal pada GROUP_CONCAT dimana daftar kelas ajar diurutkan dari kelas 10 s.d 12.

Tapi jika pada MySQL/ <= 10.1.13-MariaDB, query dengan DISTINCT tidak akan melakukan pengurutan dengan baik, maka Anda bisa menambahkan pengurutan hasil query yaitu dengan perintah ORDER BY seperti berikut

MariaDB [sikola]> SELECT nama_lengkap AS 'Guru Pengajar', GROUP_CONCAT(nama_kelas ORDER BY nama_kelas) AS 'Daftar Kelas ajar' FROM mapel_kelas_ajar
    -> LEFT JOIN field_kelas ON mapel_kelas_ajar.id_kelas=field_kelas.id_kelas
    -> LEFT JOIN user_profile ON mapel_kelas_ajar.id_guru=user_profile.uid
    -> GROUP by nama_lengkap;
+----------------------------+---------------------------------------------------+
| Guru Pengajar              | Daftar Kelas ajar                                 |
+----------------------------+---------------------------------------------------+
| Adin Permana, S.Pd, M.Pd   | 11 A,11 B,11 C,12 A,12 B,12 C                     |
| Agus Fazri.,S.Ag           | 10 A,10 B,10 C,11 A,11 B,11 C,12 A,12 B,12 C      |
| Dede Heryanto, S.Pd., M.Pd | 10 A,10 B,10 C,11 A,11 B,11 C,12 A,12 B,12 C,12 C |
| Dedeh, S.Pd                | 10 A,10 B,10 C,11 A,11 B,11 C,12 A,12 B,12 C      |
| Drs. Yusa Rizal            | 11 A,11 B,11 C,12 A,12 B,12 C                     |
| Drs.Nanang Suganda         | 10 A,10 B,10 C                                    |
| Euis Nurhidayah, S.Eng     | 10 A,10 B,10 C                                    |
| Hari Hidayat.,S.Ag         | 10 A,10 B,10 C,11 A,11 B,11 C,12 A,12 B,12 C      |
| Hermana,S.Pd               | 10 A,10 B,10 C,11 A,11 B,11 C,12 A,12 B,12 C      |
| Karmana, S.Pd              | 10 A,10 B,10 C,11 A,11 B,11 C,12 A,12 B,12 C      |
| Mukarom, S.Pd              | 10 A,10 B,10 C,11 A,11 B,11 C,12 A,12 B,12 C      |
| Suherman Juanda, S.Pd.I    | 10 A,10 B,10 C,11 A,11 B,11 C,12 A,12 B,12 C      |
+----------------------------+---------------------------------------------------+
12 rows in set (0.00 sec)

Lalu bagaimana misalnya selain dari kedua opsi diatas, kita juga ingin menampilkan daftar nama mapel ajar dari gurunya dari 2 tabel yang berbeda dengan left join, dengan asumsi bahwa satu guru bisa memiliki lebih dari 1 mapel ajar

MariaDB [sikola]> SELECT nama_lengkap AS 'Guru Pengajar', GROUP_CONCAT(DISTINCT(nama_kelas) ORDER by nama_kelas) AS 'Daftar Kelas ajar', GROUP_CONCAT(DISTINCT(mp_alias)) AS mapel_ajar FROM mapel_kelas_ajar
    -> LEFT JOIN field_kelas ON mapel_kelas_ajar.id_kelas=field_kelas.id_kelas
    -> LEFT JOIN user_profile ON mapel_kelas_ajar.id_guru=user_profile.uid
    -> LEFT JOIN mapel_pengajar ON mapel_kelas_ajar.id_guru=mapel_pengajar.id_guru
    -> LEFT JOIN mapel ON mapel_pengajar.id_mapel=mapel.id_mapel
    -> GROUP by nama_lengkap;
+----------------------------+----------------------------------------------+------------------+
| Guru Pengajar              | Daftar Kelas ajar                            | mapel_ajar       |
+----------------------------+----------------------------------------------+------------------+
| Adin Permana, S.Pd, M.Pd   | 11 A,11 B,11 C,12 A,12 B,12 C                | BING             |
| Agus Fazri.,S.Ag           | 10 A,10 B,10 C,11 A,11 B,11 C,12 A,12 B,12 C | PAI              |
| Dede Heryanto, S.Pd., M.Pd | 10 A,10 B,10 C,11 A,11 B,11 C,12 A,12 B,12 C | FSK              |
| Dedeh, S.Pd                | 10 A,10 B,10 C,11 A,11 B,11 C,12 A,12 B,12 C | KMA              |
| Drs. Yusa Rizal            | 11 A,11 B,11 C,12 A,12 B,12 C                | MTK              |
| Drs.Nanang Suganda         | 10 A,10 B,10 C                               | MTK              |
| Euis Nurhidayah, S.Eng     | 10 A,10 B,10 C                               | BING             |
| Hari Hidayat.,S.Ag         | 10 A,10 B,10 C,11 A,11 B,11 C,12 A,12 B,12 C | BARB             |
| Hermana,S.Pd               | 10 A,10 B,10 C,11 A,11 B,11 C,12 A,12 B,12 C | BLG              |
| Karmana, S.Pd              | 10 A,10 B,10 C,11 A,11 B,11 C,12 A,12 B,12 C | BIND             |
| Mukarom, S.Pd              | 10 A,10 B,10 C,11 A,11 B,11 C,12 A,12 B,12 C | MKL              |
| Suherman Juanda, S.Pd.I    | 10 A,10 B,10 C,11 A,11 B,11 C,12 A,12 B,12 C | PKn,PJKS,PDK,SBK |
+----------------------------+----------------------------------------------+------------------+

Kesimpulan
GROUP CONCAT perlu dikombinasikan dengan GROUP by akan menampilkan data secara lebih efisien dimana GROUP_CONCAT akan menghasilkan daftar kelas yang berhubungan dengan value yang tergroup dalam parameter GROUP by yang akan menghapus duplikasi pada kolom/value yang tergroup. Dan untuk mengurutkan niklai pada GROUP_CONCAT, kita bisa menggunakan tambahan parameter DISTINCT kedalam GROUP atau juga bisa ORDER by

Dengan mengetahui Contoh Implementasi Fungsi GROUP_CONCAT MySQL diharapkan kita jadi bisa menulis sebuah query secara lebih efisien sehingga ini tentunya akan memudahkan programmer dari sisi backend ataupun kode program yang mereka tulis.

0 Response to "Contoh Implementasi Fungsi GROUP_CONCAT MySQL"

Post a Comment

Komentar yang Anda kirim akan terlebih dahulu di moderasi oleh Admin