2010-04-02 20 views
187

Ich verwende GROUP_CONCAT() in einer MySQL-Abfrage, um mehrere Zeilen in eine einzige Zeichenfolge zu konvertieren. Die maximale Länge des Ergebnisses dieser Funktion ist jedoch 1024 Zeichen.MySQL und GROUP_CONCAT() maximale Länge

Ich bin sehr wohl bewusst, dass ich die param group_concat_max_len diese Grenze zu erhöhen ändern können:

SET SESSION group_concat_max_len = 1000000; 

Allerdings verwende ich auf den Server, ich keine param ändern kann. Nicht mit der vorherigen Abfrage und nicht durch Bearbeiten einer Konfigurationsdatei.

Also meine Frage ist: Gibt es eine andere Möglichkeit, die Ausgabe einer mehrreihigen Abfrage in einen einzelnen String zu bekommen?

+1

Sie meinen, anders als den Job clientseitig zu machen? – lexu

+24

Danke Kumpel ...Ihre Frage ist Antwort auf meine Frage :) –

+0

Sie scheinen bereits eine Antwort gewählt zu haben, aber aus Neugier, warum können Sie nicht die 'SET'-Anweisung verwenden, um eine Sitzungsvariable zu ändern? –

Antwort

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

Diese Abfrage ist etwas seltsam, benötigt aber keine weitere Abfrage, um die Variable zu initialisieren; und es kann in eine komplexere Abfrage eingebettet werden. Es gibt alle 'field2's durch ein Semikolon getrennt.

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

Dies ist eine gute antwort, aber nicht ganz fertig Frage - das ist, wie man eine sehr lange concat bekommt, aber was ist mit der Gruppierung? Ihre Abfrage gibt nur eine Zeile statt einer Zeile pro Gruppe zurück. – Benubird

+0

Ich erinnere mich, dass ich versuchte, die gesamte Ergebnismenge in eine einzige Saite zu bringen. – ZeWaren

+8

@Benubird das ist eine sehr schlechte Abfrage. und mit schlecht meine ich schrecklich. Das OP führt eine korrelierte Unterabfrage mit einer Unterabfrage durch, die sich in einer Unterabfrage befindet. Wenn Sie das durch Datenvergleiche untersuchen würden, hätten Sie 256 Vergleiche auf seinem Beispieldatensatz aka 4 Reihen. Jetzt stellen Sie sich vor, wenn Sie 1k Zeilen haben, das ist 1 Billion Vergleiche. –

262
SET SESSION group_concat_max_len = 1000000; 

ist eine temporäre, Session-scope, Einstellung. Es gilt nur für die aktuelle Sitzung. Sie sollten es so verwenden.

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

Sie können dies tun, auch in Sharing-Hosting, aber wenn Sie eine andere Sitzung zu verwenden, müssen Sie den SET SESSION Befehl wiederholen.

+3

Ich bevorzuge GLOBAL anstelle von SESSION: 'SET GLOBAL group_concat_max_len = 6999' , um die Einstellung für Abfragen query – IcedDante

+2

Rackspace und andere Cloud-Server nicht erlauben GLOBAL Zugriff. Ich versuche mit jdbc.execute ("SET SESSION group_concat_max_len = ..."); innerhalb der Dao Initialize-Methode, aber wie Keatkeat gesagt hat, ist dies nur vorübergehend. Wenn jemand den richtigen Weg kennt, diese Änderung dauerhaft zu machen, lassen Sie es mich wissen – IcedDante

+0

Ehrfürchtige Arbeit !!!!!!!!!!! .. Vielen Dank ... hat wie ein Zauber gearbeitet !!!! –

35

Der richtige Parameter die maximale Länge zu setzen:

SET @@group_concat_max_len = value_numeric; 

value_numeric> 1024 sein muss; standardmäßig der group_concat_max_len Wert ist 1024.

+2

SET SESSION und SET GLOBAL funktionierte auf einem bestimmten Server nicht, aber das tat! Vielen Dank! – mfink

+0

dies funktioniert, während die anderen Vorschläge nicht @ MySQL Server 5.1.41 ** (ich weiß, es ist eine alte Version) –

+1

Sie können tatsächlich 'group_concat_max_len' auf so niedrig wie ** 4 ** setzen. ([mysql docs] (http://dev.mysql.com/doc/refman/5.7/en/server-variables.html#sysvar_group_concat_max_len)). "' value_numeric' muss> = 4 sein "ist hier der Fall. Ich habe das benutzt, um zu testen, was passiert, wenn Sie den 'group_concat_max_len' Wert überschreiten. –

2

Die korrekte Syntax ist mysql>SET @@global.group_concat_max_len = integer;
Wenn Sie nicht die Privilegien haben diese auf dem Server zu tun, wo Ihre Datenbank befindet dann eine Abfrage wie verwenden:
mySQL = "SET @@session.group_concat_max_len = 10000;" oder ein anderer Wert.
Nächste Zeile:
SET objRS = objConn.Execute(mySQL)   Ihre Variablen können unterschiedlich sein.
dann
mySQL="SELECT GROUP_CONCAT(......);" etc
ich die letzte Version verwenden, da ich den Standardwert von 1024 global nicht die Berechtigungen ändern müssen (mit cPanel).
Hoffe, das hilft.

+0

Etwas, das du hier nicht gut fandst Ataur Rahman Munna? –

0

können Sie versuchen, diese

SET GLOBAL group_concat_max_len = 1000000; 
2

Fügen Sie diese Einstellung in xampp my.ini Konfigurationsdatei:

[mysqld] group_concat_max_len = 1000000

Dann starten Xampp mysql