Panjang maksimum MySQL dan GROUP_CONCAT ()

260

Saya menggunakan GROUP_CONCAT()dalam permintaan MySQL untuk mengubah beberapa baris menjadi satu string. Namun, panjang maksimum hasil fungsi ini adalah 1024karakter.

Saya sangat menyadari bahwa saya dapat mengubah param group_concat_max_lenuntuk meningkatkan batas ini:

SET SESSION group_concat_max_len = 1000000;

Namun, pada server yang saya gunakan, saya tidak dapat mengubah param. Bukan dengan menggunakan kueri sebelumnya dan bukan dengan mengedit file konfigurasi apa pun.

Jadi pertanyaan saya adalah: Apakah ada cara lain untuk mendapatkan output dari query beberapa baris menjadi satu string?

ZeWaren
sumber
1
Maksud Anda selain melakukan pekerjaan sisi klien?
lexu
40
Terima kasih sobat ... pertanyaan Anda adalah jawaban untuk pertanyaan saya :)
Mansoorkhan Cherupuzha
Anda sepertinya sudah memilih jawaban, tetapi karena penasaran, mengapa Anda tidak bisa menggunakan SETpernyataan untuk mengubah variabel sesi?
Bill Karwin
2
Itu karena permintaan yang harus saya buat tertanam dalam beberapa kerangka kerja php buatan rumah yang busuk, dan saya tidak diizinkan untuk mengedit bagian lainnya. Cara proyek ini dikodekan benar-benar memalukan.
ZeWaren
1
saya bertanya-tanya ketika menggunakan fungsi group_concat string saya kembali, saya tidak tahu bahwa fungsi ini mengembalikan sejumlah terbatas char terima kasih sobat pertanyaan Anda membuat saya jelas :)
MasoodUrRehman

Jawaban:

335
SET SESSION group_concat_max_len = 1000000;

adalah pengaturan sementara, ruang lingkup sesi,. Ini hanya berlaku untuk sesi saat ini. Anda harus menggunakannya seperti ini.

SET SESSION group_concat_max_len = 1000000;
select group_concat(column) from table group by column

Anda dapat melakukan ini bahkan dalam berbagi hosting, tetapi ketika Anda menggunakan sesi lain, Anda perlu mengulangi SET SESSIONperintah.

Keatkeat
sumber
4
Saya lebih suka menggunakan GLOBAL daripada SESI: SET GLOBAL group_concat_max_len=6999untuk membuat pengaturan ini valid di seluruh kueri
IcedDante
2
Rackspace dan server cloud lainnya tidak mengizinkan akses GLOBAL. Saya mencoba menggunakan jdbc.execute ("SET SESSION group_concat_max_len = ..."); di dalam metode inisialisasi Dao tetapi seperti yang telah dinyatakan keatkeat, ini hanya sementara. Jika ada yang tahu cara yang tepat untuk melakukan perubahan ini secara permanen, beri tahu saya
IcedDante
61

Parameter yang benar untuk mengatur panjang maksimum adalah:

SET @@group_concat_max_len = value_numeric;

value_numericharus> 1024; secara default group_concat_max_lennilainya adalah 1024.

oscar
sumber
3
SET SESI dan SET GLOBAL tidak berfungsi pada server tertentu, tetapi ini berhasil! Terima kasih!
mfink
ini bekerja sementara saran lainnya tidak @ MySQL Server 5.1.41 (saya tahu ini versi lama)
low_rents
2
Anda dapat mengatur group_concat_max_lenke 4 . ( mysql docs ). " value_numericharus> = 4" demikian halnya di sini. Saya sebenarnya menggunakan ini untuk menguji apa yang terjadi ketika Anda melebihi group_concat_max_lennilai.
Thomas F
1
Saya dapat mengonfirmasi bahwa parameter ini sama sekali BUKAN reboot-proof: setelah mysql di-restart, properti dipindahkan ke 1024, jadi -1 untuk saya
Frédéric
2
@Tidak, Anda harus mengatur nilai dalam file konfigurasi (mis. My.cnf) agar pengaturan dapat diterapkan pada restart mysql. Tidak ada SETpermintaan yang akan memengaruhi pengaturan setelah dimulai ulang.
Buttle Butkus
18

Sertakan pengaturan ini di file konfigurasi xampp my.ini:

[mysqld]
group_concat_max_len = 1000000

Kemudian restart xampp mysql

Chinnadurai Ramalingam
sumber
8

Anda bisa mencoba ini

SET GLOBAL group_concat_max_len = 1000000;
Mohamed El Mrabet
sumber
Saya menjalankan ini adalah klien sqlyog untuk db saya, tetapi tidak mencerminkan. Tapi sepertinya berfungsi ketika saya menjalankannya melalui program java saya
Jerry
5

Sintaks yang benar adalah mysql> SET @@global.group_concat_max_len = integer;
Jika Anda tidak memiliki hak istimewa untuk melakukan ini di server tempat database Anda berada maka gunakan query seperti:
mySQL = "SET @@session.group_concat_max_len = 10000;"atau nilai yang berbeda.
Baris berikutnya:
SET objRS = objConn.Execute(mySQL)  variabel Anda mungkin berbeda.
maka
mySQL="SELECT GROUP_CONCAT(......);"dll
saya menggunakan versi terakhir karena saya tidak memiliki hak untuk mengubah nilai default 1024 secara global (menggunakan cPanel).
Semoga ini membantu.

Ola Balstad
sumber
2
CREATE TABLE some_table (
  field1 int(11) NOT NULL AUTO_INCREMENT,
  field2 varchar(10) NOT NULL,
  field3 varchar(10) NOT NULL,
  PRIMARY KEY (`field1`)
);

INSERT INTO `some_table` (field1, field2, field3) VALUES
(1, 'text one', 'foo'),
(2, 'text two', 'bar'),
(3, 'text three', 'data'),
(4, 'text four', 'magic');

Kueri ini agak aneh tetapi tidak perlu kueri lain untuk menginisialisasi variabel; dan itu bisa tertanam dalam kueri yang lebih kompleks. Ia mengembalikan semua 'field2 yang dipisahkan oleh tanda titik koma.

SELECT result
FROM   (SELECT @result := '',
               (SELECT result
                FROM   (SELECT @result := CONCAT_WS(';', @result, field2) AS result,
                               LENGTH(@result)                            AS blength
                        FROM   some_table
                        ORDER  BY blength DESC
                        LIMIT  1) AS sub1) AS result) AS sub2; 
ZeWaren
sumber
1
Ini adalah jawaban yang bagus, tetapi tidak cukup menyelesaikan pertanyaan - ini adalah bagaimana mendapatkan konser yang sangat panjang, tetapi bagaimana dengan pengelompokan? Kueri Anda hanya mengembalikan satu baris, bukan satu baris per grup.
Benubird
Saya ingat itulah yang saya coba lakukan - mendapatkan seluruh hasil yang ditetapkan menjadi satu string.
ZeWaren
9
@ Benubird ini adalah permintaan yang sangat buruk. dan maksud saya buruk. OP melakukan subquery berkorelasi yang memiliki subquery yang ada di dalam subquery. jika Anda memeriksa bahwa dengan perbandingan data Anda akan memiliki 256 perbandingan pada kumpulan data sampelnya alias 4 baris .. sekarang bayangkan jika Anda memiliki 1k baris itu 1 triliun perbandingan.
John Ruddell
@ JohnRuddell Ya, benar. Saya dapat meyakinkan Anda bahwa kueri ini tidak ada di dekat sistem live yang serius. Pada saat itu, saya membutuhkannya untuk semacam tantangan / latihan.
ZeWaren
5
Ah paham .. Saya sarankan Anda mencatatnya untuk orang yang lewat ... Karena jawaban ini akan menyesatkan :) usaha yang menarik
John Ruddell