Bagaimana cara menggunakan GROUP BY untuk merangkai string di MySQL?

351

Pada dasarnya pertanyaannya adalah bagaimana mendapatkan dari ini:

foo_id foo_name
1 A
1 B
2 C

untuk ini:

foo_id foo_name
1 AB
2 C
Paweł Hajdan
sumber
13
DOWNVOTE itu benar-benar membingungkan untuk menamai string kolom, memberinya nama yang terlihat seperti tipe data. Jadi, setiap jawaban juga dipengaruhi oleh hal itu karena jawaban tersebut terlihat seperti menentukan tipe data saat mereka menentukan nama kolom
barlop
2
@barlop memperbaikinya dengan mengedit pertanyaan dan jawaban.
ustun

Jawaban:

164
SELECT id, GROUP_CONCAT( string SEPARATOR ' ') FROM table GROUP BY id

Lebih detail di sini .

Dari tautan di atas GROUP_CONCAT,: Fungsi ini mengembalikan hasil string dengan nilai-nilai non-NULL gabungan dari grup. Ini mengembalikan NULL jika tidak ada nilai-nilai NULL.

Graeme Perrow
sumber
kolom yang dihasilkan memiliki batas karakter. lihat di sini dan dokumen :)
marlo
18
SELECT id, GROUP_CONCAT(CAST(name as CHAR)) FROM table GROUP BY id

Akan memberi Anda string yang dibatasi koma

Wayne
sumber
17
SELECT id, GROUP_CONCAT(name SEPARATOR ' ') FROM table GROUP BY id;

: - Di MySQL, Anda bisa mendapatkan nilai gabungan dari kombinasi ekspresi. Untuk menghilangkan nilai duplikat, gunakan klausa DISTINCT . Untuk mengurutkan nilai dalam hasil, gunakan klausa ORDER BY. Untuk mengurutkan dalam urutan terbalik , tambahkankata kunci DESC (descending) ke nama kolom yang Anda sortir dalam klausa ORDER BY. Standarnya adalah urutan naik; ini dapat ditentukan secara eksplisit menggunakan kata kunci ASC. Pemisah default antara nilai-nilai dalam suatu grup adalah koma (","). Untuk menentukan pemisah secara eksplisit, gunakan SEPARATOR diikuti dengan nilai literal string yang harus dimasukkan di antara nilai grup. Untuk menghilangkan pemisah sama sekali, tentukan SEPARATOR '' .

GROUP_CONCAT([DISTINCT] expr [,expr ...]
             [ORDER BY {unsigned_integer | col_name | expr}
                 [ASC | DESC] [,col_name ...]]
             [SEPARATOR str_val])

ATAU

mysql> SELECT student_name,
    ->     GROUP_CONCAT(DISTINCT test_score
    ->               ORDER BY test_score DESC SEPARATOR ' ')
    ->     FROM student
    ->     GROUP BY student_name;
Exundoz
sumber
15

Hasilnya dipotong dengan panjang maksimum yang diberikan oleh variabel sistem group_concat_max_len, yang memiliki nilai default 1024 karakter, jadi pertama-tama kita lakukan:

SET group_concat_max_len=100000000;

dan kemudian, misalnya:

SELECT pub_id,GROUP_CONCAT(cate_id SEPARATOR ' ') FROM book_mast GROUP BY pub_id
Waqar Alamgir
sumber
Hasilnya adalah dipotong dengan panjang maksimum yang diberikan oleh variabel sistem group_concat_max_len, yang memiliki nilai default dari 1024 karakter. docs
marlo
Apa ruang lingkup group_concat_max_lenkonfigurasi ini ? Koneksi / sesi saat ini, atau apakah akan memengaruhi klien lain?
Api Beku
@FrozenFlame:> Jika tidak ada pengubah, SET mengubah variabel sesi. Jika variabel tidak memiliki nilai sesi, kesalahan terjadi. Dari dev.mysql.com/doc/refman/5.7/en/using-system-variables.html
arminrosu
3
Ini tidak menjawab pertanyaan OP tetapi hanya menambah informasi yang bermanfaat. Ini harus berupa komentar, bukan jawaban.
Sean the Bean
1
Terima kasih atas cuplikan kode ini, yang mungkin memberikan bantuan terbatas dan segera. Sebuah penjelasan yang tepat akan sangat meningkatkan nilai jangka panjang dengan menunjukkan mengapa ini adalah solusi yang baik untuk masalah ini dan akan membuatnya lebih bermanfaat untuk pembaca masa depan dengan lainnya, pertanyaan-pertanyaan serupa. Harap edit jawaban Anda untuk menambahkan beberapa penjelasan, termasuk asumsi yang Anda buat.
Donald Duck
11

Jawaban yang bagus Saya juga punya masalah dengan NULLS dan berhasil menyelesaikannya dengan memasukkan COALESCE ke dalam GROUP_CONCAT. Contoh sebagai berikut:

SELECT id, GROUP_CONCAT(COALESCE(name,'') SEPARATOR ' ') 
FROM table 
GROUP BY id;

Semoga ini bisa membantu orang lain

Mauricio Alo
sumber