Contoh Implementasi Fungsi GROUP_CONCAT MySQL
Dimisalkan Saya memiliki 3 buah tabel yaitu tabel user_profile, field_kelas, dan mapel_kelas_ajar.
- Tabel kelas ajar berisi nama – nama guru beserta kelas ajarnya dan setiap guru itu bisa memiliki banyak kelas ajar.
- Tabel kelas berisi nama – nama kelas
- 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;
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