2010-04-02 15 views
187
Tek bir dizeye birden çok satır dönüştürmek için bir MySQL sorgusunda GROUP_CONCAT() kullanıyorum

. Ancak bu fonksiyonun sonucu maksimum uzunluğu 1024 karakterdir.MySQL ve GROUP_CONCAT() maksimum uzunluğu

ben çok iyi farkında ben bu sınırı artırmak param group_concat_max_len değişebileceğini değilim:

SET SESSION group_concat_max_len = 1000000; 

Ancak, ben kullanıyorum sunucuda, herhangi param değiştiremez. Herhangi bir yapılandırma dosyasını düzenleyerek değil, önceki sorguyu kullanarak değil.

Yani benim soru: mı var tek bir dize halinde çoklu satır sorgu çıktısını almak için başka bir yolu?

+1

xampp mysql yeniden iş tarafı tarafındaki işi yapmaktan başka? – lexu

+24

Teşekkürler dostum ...Sorunuz benim soruma cevaptır :) –

+0

Zaten bir cevap seçtiniz gibi görünüyor, ama meraktan dolayı, neden bir oturum değişkeni değiştirmek için 'SET' deyimini kullanamazsınız? –

cevap

3
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'); 

Bu sorgu biraz garip ama değişkeni başlatmak için başka bir sorguya ihtiyaç duymuyor; ve daha karmaşık bir sorguya gömülebilir. Bu döndüren bir noktalı virgül ile ayrılmış hepsi 'field2 en.

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; 
+1

Bu harika bir cevap, ama tamamen bitmiyor soru - bu çok uzun bir yarışma nasıl elde edilir, ne gruplandırma hakkında? Sorgunuz, grup başına yalnızca bir satır yerine yalnızca bir satır döndürür. – Benubird

+0

Yaptığım şeyi hatırladım, tüm sonuç kümesini tek bir dizeye ekledim. – ZeWaren

+8

@Benubird bu çok kötü bir sorgu. ve kötü tarafından çok kötü demek istiyorum. OP, bir alt sorgunun içinde yer alan bir alt soruna sahip olan ilişkili bir alt sorgu yapıyor. Eğer veri karşılaştırmalarına göre, eğer 4 satırlık örnek veri seti üzerinde 256 karşılaştırma yapmış olsaydınız .. Şimdi 1 trilyon karşılaştırmaları olan 1k satırlarınız varsa hayal edin. –

262
SET SESSION group_concat_max_len = 1000000; 

geçici, oturum kapsamı, ayardır. Sadece geçerli oturum için geçerlidir, bunu böyle kullanmalısınız.

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

Hatta paylaşım barındırma yapabilirsiniz, ancak bir diğer oturumlar kullandığınızda, SET SESSION komutu tekrarlamanız gerekir.

+3

Oturumun – IcedDante

+2

Rackspace ve diğer bulut sunucularının GLOBAL erişimine izin vermemesi için ayar yapmak için GLOBAL yerine SESSION: 'SET GLOBAL group_concat_max_len = 6999' kullanmayı tercih ettim. Jdbc.execute kullanmayı denerim ("SET SESSION group_concat_max_len = ..."); Dao başlangıç ​​yöntemi içinde ama keatkeat belirtildiği gibi, bu sadece geçicidir. Bu değişikliği kalıcı olarak yapmanın doğru yolu bilen varsa lütfen bana bildirin – IcedDante

+0

Awesome work !!!!!!!!!!! .. Çok teşekkür ederim ... bir cazibe gibi çalıştı !! –

35

maksimum uzunluğunu ayarlamak için doğru bir parametredir:

SET @@group_concat_max_len = value_numeric; 

value_numeric olmalıdır> 1024; Varsayılan olarak group_concat_max_len değerdir 1024

+2

SET SESSION ve SET GLOBAL belirli bir sunucu üzerinde çalışmadı, ama bu yaptı! Teşekkürler! – mfink

+0

bu, diğer önerileri yerine getirmedi. ** MySQL Server 5.1.41 ** (eski bir sürüm olduğunu biliyorum) –

+1

Aslında 'group_concat_max_len' değerini ** 4 ** olarak ayarlayabilirsiniz. ([mysql docs] (http://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_group_concat_max_len)). "' value_numeric' olmalıdır.> = 4 "burada böyledir. Bunu, 'group_concat_max_len' değerini aştığınızda ne olduğunu test etmek için kullandım. –

2

doğru sözdizimi mysql>SET @@global.group_concat_max_len = integer;
Eğer veritabanı sonra böyle bir sorgu kullanmak bulunduğu yere sunucuda bunu yapmak ayrıcalıkları yoksa: = "SET @@session.group_concat_max_len = 10000;"
mySQL veya farklı bir değer.
Sonraki satır:
SET objRS = objConn.Execute(mySQL)   Değişkenleriniz farklı olabilir.
sonra
mySQL="SELECT GROUP_CONCAT(......);" I (cPanel kullanarak) küresel 1024 varsayılan değerini değiştirmek için ayrıcalığa sahip olmadığı için son sürümünü kullanmak
vb.
Bu yardımcı olur umarım.

+0

Burada onaylamadığınız bir şey Ataur Rahman Munna? –

0

Bu

SET GLOBAL group_concat_max_len = 1000000; 
2

xampp my.ini yapılandırma dosyasında bu ayarı dahil deneyebilirsiniz:

[mysqld] group_concat_max_len = 1000000

Sonra Yani

İlgili konular