Di MySQL, Anda dapat mengembalikan hasil kueri Anda sebagai daftar yang dipisahkan koma dengan menggunakan GROUP_CONCAT()
fungsi.
GROUP_CONCAT()
fungsi dibuat khusus untuk tujuan menggabungkan hasil kueri yang ditetapkan ke dalam daftar yang dipisahkan oleh koma, atau pembatas pilihan Anda.
Artikel ini memberikan contoh cara kerjanya.
Data
Pertama, mari gunakan data berikut dalam beberapa contoh pertama kami:
USE Solutions; SELECT TaskName FROM Tasks;
Hasil:
+-------------------+ | TaskName | +-------------------+ | Do garden | | Feed cats | | Paint roof | | Take dog for walk | | Relax | | Feed cats | +-------------------+
Contoh Dasar
Berikut adalah contoh dasar untuk mendemonstrasikan GROUP_CONCAT()
fungsi:
SELECT GROUP_CONCAT(TaskName) FROM Tasks;
Hasil:
+------------------------------------------------------------------+ | GROUP_CONCAT(TaskName) | +------------------------------------------------------------------+ | Do garden,Feed cats,Paint roof,Take dog for walk,Relax,Feed cats | +------------------------------------------------------------------+
Seperti yang Anda lihat, setiap baris dari kumpulan hasil telah digabungkan menjadi satu baris. Secara default, daftar dipisahkan dengan koma.
Perhatikan bahwa ada batasan berapa lama daftar ini bisa. Lebih lanjut tentang ini nanti di artikel.
Contoh – BERBEDA
Anda dapat menggunakan DISTINCT
untuk menghapus duplikat (sehingga catatan duplikat menjadi satu catatan).
Contoh:
SELECT GROUP_CONCAT(DISTINCT TaskName) FROM Tasks;
Hasil:
+--------------------------------------------------------+ | GROUP_CONCAT(DISTINCT TaskName) | +--------------------------------------------------------+ | Do garden,Feed cats,Paint roof,Relax,Take dog for walk | +--------------------------------------------------------+
Jadi dalam hal ini, “Beri makan kucing” hanya dicantumkan satu kali, sedangkan pada contoh sebelumnya dicantumkan dua kali.
Contoh – ORDER OLEH
Anda dapat menggunakan ORDER BY
untuk mengurutkan hasil berdasarkan kolom tertentu.
Contoh:
SELECT GROUP_CONCAT(DISTINCT TaskName ORDER BY TaskName DESC) FROM Tasks;
Hasil:
+--------------------------------------------------------+ | GROUP_CONCAT(DISTINCT TaskName ORDER BY TaskName DESC) | +--------------------------------------------------------+ | Take dog for walk,Relax,Paint roof,Feed cats,Do garden | +--------------------------------------------------------+
Jadi dalam hal ini saya menggunakan DESC
untuk menentukan bahwa itu harus dalam urutan menurun. Nilai alternatif (dan default) adalah ASC
untuk naik.
Contoh – Tentukan Pembatas
Secara default, daftar adalah daftar yang dipisahkan koma. Namun, Anda dapat menentukan pembatas pilihan Anda jika diperlukan.
Untuk melakukannya, gunakan SEPARATOR
diikuti dengan nilai literal string yang harus disisipkan di antara nilai grup.
Contoh:
SELECT GROUP_CONCAT(DISTINCT TaskName SEPARATOR ' + ') FROM Tasks;
Hasil:
+----------------------------------------------------------------+ | GROUP_CONCAT(DISTINCT TaskName SEPARATOR ' + ') | +----------------------------------------------------------------+ | Do garden + Feed cats + Paint roof + Relax + Take dog for walk | +----------------------------------------------------------------+
Contoh – Menggabungkan Kolom
Anda juga dapat menggabungkan kolom, dan menyediakan pemisahnya sendiri dengan memberikan nilai literal string.
Contoh:
SELECT GROUP_CONCAT(TaskId, ') ', TaskName SEPARATOR ' ') FROM Tasks;
Hasil:
+------------------------------------------------------------------------------------+ | GROUP_CONCAT(TaskId, ') ', TaskName SEPARATOR ' ') | +------------------------------------------------------------------------------------+ | 1) Do garden 2) Feed cats 3) Paint roof 4) Take dog for walk 5) Relax 6) Feed cats | +------------------------------------------------------------------------------------+
Dalam contoh ini kami mengembalikan keduanya TaskId
kolom dan TaskName
kolom, dipisahkan oleh tanda kurung tutup dan spasi. Kami juga menggunakan SEPARATOR
argumen untuk menentukan bahwa pembatas yang akan digunakan di antara setiap baris (bersambung) harus berupa spasi (bukan koma default).
Hasil yang Dikelompokkan
GROUP_CONCAT()
fungsi dapat berguna untuk kesempatan di mana Anda ingin memberikan daftar hasil, dikelompokkan berdasarkan kolom lain.
Misalnya, Anda mungkin menginginkan daftar artis, dengan masing-masing artis diikuti dengan daftar album yang telah mereka rilis.
Untuk mendemonstrasikan ini, katakanlah kita memiliki database dengan dua tabel; Artists
dan Albums
. Ada hubungan satu ke banyak antara tabel-tabel ini. Untuk setiap artis, mungkin ada banyak album.
Jadi kueri biasa yang menggabungkan kedua tabel mungkin terlihat seperti ini:
USE Music; SELECT ar.ArtistName, al.AlbumName FROM Artists ar INNER JOIN Albums al ON ar.ArtistId = al.ArtistId;
Hasil:
+------------------------+--------------------------+ | ArtistName | AlbumName | +------------------------+--------------------------+ | Iron Maiden | Powerslave | | AC/DC | Powerage | | Jim Reeves | Singing Down the Lane | | Devin Townsend | Ziltoid the Omniscient | | Devin Townsend | Casualties of Cool | | Devin Townsend | Epicloud | | Iron Maiden | Somewhere in Time | | Iron Maiden | Piece of Mind | | Iron Maiden | Killers | | Iron Maiden | No Prayer for the Dying | | The Script | No Sound Without Silence | | Buddy Rich | Big Swing Face | | Michael Learns to Rock | Blue Night | | Michael Learns to Rock | Eternity | | Michael Learns to Rock | Scandinavia | | Tom Jones | Long Lost Suitcase | | Tom Jones | Praise and Blame | | Tom Jones | Along Came Jones | | Allan Holdsworth | All Night Wrong | | Allan Holdsworth | The Sixteen Men of Tain | +------------------------+--------------------------+
Seperti yang Anda lihat, saat menggunakan format ini, jika seorang artis memiliki lebih dari satu album, artis tersebut akan dicantumkan beberapa kali – sekali untuk setiap album.
Kami dapat mengubah kueri ini sehingga setiap artis hanya terdaftar satu kali. Jika artis memiliki lebih dari satu album, semua album ditampilkan dalam satu bidang dalam daftar yang dipisahkan koma. Kami dapat melakukan ini berkat GROUP_CONCAT()
fungsi.
Contoh:
USE Music; SELECT ar.ArtistName, GROUP_CONCAT(al.AlbumName) FROM Artists ar INNER JOIN Albums al ON ar.ArtistId = al.ArtistId GROUP BY ArtistName;
Hasil:
+------------------------+----------------------------------------------------------------------------+ | ArtistName | GROUP_CONCAT(al.AlbumName) | +------------------------+----------------------------------------------------------------------------+ | AC/DC | Powerage | | Allan Holdsworth | All Night Wrong,The Sixteen Men of Tain | | Buddy Rich | Big Swing Face | | Devin Townsend | Epicloud,Ziltoid the Omniscient,Casualties of Cool | | Iron Maiden | Somewhere in Time,Piece of Mind,Powerslave,Killers,No Prayer for the Dying | | Jim Reeves | Singing Down the Lane | | Michael Learns to Rock | Eternity,Scandinavia,Blue Night | | The Script | No Sound Without Silence | | Tom Jones | Long Lost Suitcase,Praise and Blame,Along Came Jones | +------------------------+----------------------------------------------------------------------------+
Hati-hati dengan Panjangnya!
Satu hal penting yang perlu Anda perhatikan saat menggunakan GROUP_CONCAT()
adalah bahwa hasilnya terpotong ke panjang maksimum yang disediakan oleh group_concat_max_len
variabel sistem, yang memiliki nilai default 1024
.
Nilai variabel ini dapat disetel lebih tinggi, dengan menggunakan sintaks berikut:
SET [GLOBAL | SESSION] group_concat_max_len = val;
Dimana val
adalah bilangan bulat tak bertanda.
Namun, perhatikan bahwa panjang maksimum efektif dari nilai pengembalian itu sendiri dibatasi oleh nilai max_allowed_packet
.