MySQL memiliki GROUP_CONCAT()
fungsi yang memungkinkan kita mengembalikan kolom dari kueri sebagai daftar yang dibatasi.
Ini mengembalikan hasil string dengan gabungan non-NULL
nilai dari grup.
Sintaks
Sintaksnya seperti ini:
GROUP_CONCAT([DISTINCT] expr [,expr ...]
[ORDER BY {unsigned_integer | col_name | expr}
[ASC | DESC] [,col_name ...]]
[SEPARATOR str_val])
Contoh
Misalkan kita menjalankan kueri berikut:
SELECT PetName
FROM Pets;
Dan kita mendapatkan hasil sebagai berikut:
+---------+ | PetName | +---------+ | Fluffy | | Fetch | | Scratch | | Wag | | Tweet | | Fluffy | | Bark | | Meow | +---------+ 8 rows in set (0.00 sec)
Kita dapat menggunakan GROUP_CONCAT()
untuk mengembalikan semua baris itu sebagai daftar yang dibatasi.
Untuk melakukan ini, kita harus melewati PetName
kolom sebagai argumen ke GROUP_CONCAT()
fungsi:
SELECT GROUP_CONCAT(PetName)
FROM Pets;
Hasil:
+-------------------------------------------------+ | GROUP_CONCAT(PetName) | +-------------------------------------------------+ | Fluffy,Fetch,Scratch,Wag,Tweet,Fluffy,Bark,Meow | +-------------------------------------------------+ 1 row in set (0.01 sec)
Memesan
Kita dapat menggunakan ORDER BY
klausa untuk memesan output dari fungsi ini:
SELECT GROUP_CONCAT(PetName ORDER BY PetName ASC)
FROM Pets;
Hasil:
Bark,Fetch,Fluffy,Fluffy,Meow,Scratch,Tweet,Wag
Perhatikan bahwa ini hanya mengurutkan output dari GROUP_CONCAT()
fungsi – ini benar-benar tidak tergantung pada urutan apa pun yang diterapkan ke SELECT
pernyataan itu sendiri.
Yang DISTINCT
Klausa
Kita dapat menggunakan DISTINCT
klausa untuk mengembalikan nilai unik. Dengan kata lain, jika ada nilai duplikat, hanya satu kemunculan yang dikembalikan:
SELECT GROUP_CONCAT(DISTINCT PetName ORDER BY PetName ASC)
FROM Pets;
Hasil:
Bark,Fetch,Fluffy,Meow,Scratch,Tweet,Wag
Dalam hal ini, Fluffy
hanya muncul sekali. Saat kami menjalankannya tanpa kode DISTINCT
klausa, Fluffy
muncul dua kali.
Mengubah Pemisah
Secara default, daftar menggunakan koma sebagai pembatas. Tapi kita bisa mengubahnya jika kita mau:
SELECT GROUP_CONCAT(PetName SEPARATOR '-')
FROM Pets;
Hasil:
Fluffy-Fetch-Scratch-Wag-Tweet-Fluffy-Bark-Meow
Kita bahkan dapat menggunakan string kosong untuk menghapus semua pemisah (sehingga nilainya digabungkan):
SELECT GROUP_CONCAT(PetName SEPARATOR '')
FROM Pets;
Dan kita mendapatkan hasil sebagai berikut:
FluffyFetchScratchWagTweetFluffyBarkMeow
Hasil Kueri yang Dikelompokkan
Kami dapat menyertakan GROUP_CONCAT()
dalam kueri dengan GROUP BY
klausa untuk mencapai hasil seperti ini:
SELECT
PetTypeId,
GROUP_CONCAT(PetName ORDER BY PetName ASC)
FROM Pets
GROUP BY PetTypeId
ORDER BY PetTypeId;
Hasil:
+-----------+--------------------------------------------+ | PetTypeId | GROUP_CONCAT(PetName ORDER BY PetName ASC) | +-----------+--------------------------------------------+ | 1 | Tweet | | 2 | Fluffy,Meow,Scratch | | 3 | Bark,Fetch,Fluffy,Wag | +-----------+--------------------------------------------+
Di database saya, nama jenis hewan peliharaan yang sebenarnya ada di tabel lain yang disebut PetTypes
. Oleh karena itu, kami dapat menjalankan INNER JOIN
pada PetTypes
tabel untuk mendapatkan nama jenis hewan peliharaan yang sebenarnya:
SELECT
pt.PetType,
GROUP_CONCAT(p.PetName ORDER BY p.PetName ASC)
FROM Pets p
INNER JOIN PetTypes pt ON
p.PetTypeId = pt.PetTypeId
GROUP BY pt.PetType
ORDER BY pt.PetType ASC;
Hasil:
+---------+------------------------------------------------+ | PetType | GROUP_CONCAT(p.PetName ORDER BY p.PetName ASC) | +---------+------------------------------------------------+ | Bird | Tweet | | Cat | Fluffy,Meow,Scratch | | Dog | Bark,Fetch,Fluffy,Wag | +---------+------------------------------------------------+
Batasan Panjang
GROUP_CONCAT()
keluaran terpotong ke panjang maksimum yang diberikan oleh group_concat_max_len
variabel sistem, yang memiliki nilai default 1024
. Nilai dapat diatur lebih tinggi, meskipun panjang maksimum efektif dari nilai pengembalian dibatasi oleh nilai max_allowed_packet
.
Anda dapat memeriksa nilai saat ini seperti ini:
SHOW VARIABLES LIKE '%group_concat%';
Sintaks untuk mengubah nilai ini adalah sebagai berikut:
SET [GLOBAL | SESSION] group_concat_max_len = val;
Dimana val
adalah bilangan bulat tidak bertanda.