Mengenal Fungsi GROUP_CONCAT() di MySQL
Beberapa hari yang lalu saya mendapat pertanyaan menarik melalui email dari salah satu pengunjung situs Achmatim.Net yang berasal dari Magelang. Si Penanya mengalami kesulitan dalam menampilkan daftar nilai siswa/mahasiswa dalam satu field yang dikelompokkan berdasarkan NIM (nomor induk mahasiswa) dan mata pelajarannya. Mendapat pertanyaan tersebut, saya langsung tertuju ke satu fungsi di MySQL, yaitu GROUP_CONCAT(). Berikut ini pembahasan selengkapnya.
Sebagai gambaran, penanya memberikan suatu tabel dan isi datanya sebagai berikut:
NIM kdMapel testKe Nilai 2011001 101 01 8 2011002 101 01 7 2011003 101 01 6 2011001 102 01 9 2011002 102 01 8 2011003 102 01 7 2011001 101 02 7 2011002 101 02 7 2011003 101 02 9 2011001 101 03 8 2011002 101 03 8 2011003 101 03 9 2011001 102 02 7 2011002 102 02 8 2011003 102 02 9
Dan tampilan yang diinginkan adalah sebagai berikut:
NIM kdMapel Nilai 2011001 101 8,7,8 2011002 101 7,7,8 2011003 101 6,7,9 2011001 102 9,7 2011002 102 8,8 2011003 102 7,9
Ya, seperti yang sudah saya sebutkan di atas, kita dapat menyelesaikannya dengan mudah menggunakan fungsi GROUP_CONCAT(). Menurut manual MySQL, fungsi ini dapat digunakan untuk menghasilkan suatu string dari beberapa isi record berdasarkan pengelompokkan tertentu. Seperti pada kasus di atas, bahwa yang diinginkan adalah nilai ditampilkan secara mendatar berdasarkan pengelompokkan NIM dan kdMapel.
Sebelum mencoba fungsi GROUP_CONCAT(), kita akan mencoba melakukan grouping terlebih dahulu dengan perintah SQL sebagai berikut:
SELECT nim,kdMapel,nilai FROM tab_ulangan GROUP BY kdMapel, nim
Setelah dijalankan, ternyata hasilnya masih belum sempurna. Memang sudah terjadi pengelompokkan berdasarkan kdMapel dan nim, namun nilai yang ditampilkan hanya satu nilai. Berikut ini hasilnya:
+---------+---------+-------+ | nim | kdMapel | nilai | +---------+---------+-------+ | 2011001 | 101 | 8 | | 2011002 | 101 | 7 | | 2011003 | 101 | 6 | | 2011001 | 102 | 9 | | 2011002 | 102 | 8 | | 2011003 | 102 | 7 | +---------+---------+-------+ 6 rows in set (0.00 sec)
Nah, dengan menggunakan fungsi GROUP_CONCAT() kita akan menghasilkan tampilan yang berbeda. Perhatikan perintah query berikut ini:
SELECT nim, kdMapel, GROUP_CONCAT(nilai SEPARATOR ',') as nilai FROM tab_ulangan GROUP BY kdMapel, nim
dan hasilnya sebagai berikut:
+---------+---------+-------+ | nim | kdMapel | nilai | +---------+---------+-------+ | 2011001 | 101 | 8,8,7 | | 2011002 | 101 | 8,7,7 | | 2011003 | 101 | 9,6,9 | | 2011001 | 102 | 9,7 | | 2011002 | 102 | 8,8 | | 2011003 | 102 | 7,9 | +---------+---------+-------+ 6 rows in set (0.00 sec)
Mudah bukan??
Jika diinginkan, kita juga bisa melakukan pengurutan nilai tersebut dengan menambahkan ORDER BY. Selain itu, juga kita juga dapat menambahkan DISTINCT untuk mencegah duplikasi data nilai. Berikut ini contoh variasi query yang ditambahkan pengurutan data berdasarkan nilai yang terbesar.
SELECT nim, kdMapel, GROUP_CONCAT(nilai ORDER BY nilai DESC SEPARATOR ',') as nilai FROM tab_ulangan GROUP BY kdMapel, nim
Bagaimana hasilnya? Silahkan dicoba sendiri.
Semoga bermanfaat dan maju terus ilmu pengetahuan Indonesia.
terima kasih pak…. sangat bermanfaat sekali segera di coba dan mencoba mengembangkan ya…. thanks
Wow, mengikuti blog ini ibarat ikut kuliah gratis. Terima kasih boss, telah berbagi sesuatu yang sangat berharga.:-)
terima kasih pak atas tutorialnya..ini sangat berguna sekali,,pasti banyak yg terbantu…
tutorial anda ibarat saya kuliah saja…setiap membaca postingan di web ini makin membantu pengethuan saya..terima kasih pak
Thank you for your article, I feel that my life and find you how. Your blog is like a mirror..
Makasih pak dh mau berbagi2 ilmu…
Mudah, Jelas, Gampang Dimengerti.
maaf pak saya mau tanya, kalau perintah select lebih dari 3 database di mysql gimana ya pak ?
terimakasih …
makasih pak ilmunya
meski masih bingung mengertinya, tapi akan saya baca lagi hehehhee… trims, kang
Terima kasih ats informasinya, sukses selalu…
Terima kasih atas informasinya, sukses selalu…
tutorial yang bagus Pak.
tapi saya ada satu pertanyaan.
bagaimana cara variasi query jika ingin menampilkan data yang paling terakhir diinput??
misal seperti contoh di atas jika saya hanya ingin menampilkan 2011001 | 101 | 8,8,7 |
kode dibawah ini sudah saya coba utak atik menjadi
SELECT nim, kdMapel, GROUP_CONCAT(nilai ORDER BY nilai DESC SEPARATOR ‘,’) as nilai
FROM tab_ulangan GROUP BY kdMapel, nim
menjadi
SELECT nim, kdMapel, GROUP_CONCAT(nilai ORDER BY nilai DESC LIMIT 1 SEPARATOR ‘,’) as nilai
FROM tab_ulangan GROUP BY kdMapel, nim
tapi tidak berhasil…malah tampilannya kosong
mohon bantuaanya ya Pak Dosen..:-)
to achmatin: mas saya sudah dapat jawaban dari pertanyaan saya sendiri.setelah saya utak-atik codingnya ternyata saya ada salah penempatan Coding
Awalnya
SELECT nim, kdMapel, GROUP_CONCAT(nilai ORDER BY nilai DESC LIMIT 1 SEPARATOR ‘,’) as nilai
FROM tab_ulangan GROUP BY kdMapel, nim
seharusya Coding yang saya garis bawah berada pada
SELECT nim, kdMapel, GROUP_CONCAT(nilai ORDER BY nilai SEPARATOR ‘,’) as nilai
FROM tab_ulangan GROUP BY kdMapel, nim order by nim DESC LIMIT 1
T’x buat tutorial Group_concat() nya..
Terima kasih atas informasinya & sangat bermanfaat.
Sukses selalu…
Terima kasih bayak pa…saya adalah pengguna pemula dan sangat awam untuk database menggunakan mysql, walaupun saya sangat mahir menggunakan visual foxpro, namun ternyata dunia kerja menuntut mysql, oleh karena itu aku terpaksa harus belajar lagi…
Thaks byk pa…aku sangat awam dengan program database dengan menggunakan mysql, walaupuan saya mahir menggunakan visual foxpro, namun ternyata dunia kerja menuntut dan rata2 menuntut untuk menggunakan mysql, oleh karena itu terpaksa aku belajar lagi…..thaks byk untuk penjelasannya…
salam..
Stanly Making
siip dah…
Terima kasih ya..pak atas informasinya Semoga dapat saya pindahkan ke anak murid saya..
amin. semoga bermanfaat dan dapat dibagikan juga ke orang lain
informasinya sangat berguna
Makasih Pak Achmad …. ijin mau nyoba dulu….
ini tutorial yg saya cari ne.., mantap..