1481 Stimmen

Kann ich mehrere MySQL-Zeilen in ein Feld verketten?

Verwendung von MySQL kann ich etwas tun wie:

SELECT hobbies FROM peoples_hobbies WHERE person_id = 5;

Mein Output:

shopping
fishing
coding

aber stattdessen möchte ich nur 1 Zeile, 1 Spalte:

Erwartetes Ergebnis:

shopping, fishing, coding

Der Grund dafür ist, dass ich mehrere Werte aus mehreren Tabellen auswähle, und nach all den Verknüpfungen habe ich viel mehr Zeilen als ich möchte.

Ich habe nach einer Funktion gesucht auf MySQL-Doku und es sieht nicht so aus, als ob die CONCAT o CONCAT_WS Funktionen akzeptieren Ergebnismengen.

Weiß jemand, wie man das macht?

10 Stimmen

Ich habe gerade eine kleine Demo zur Verwendung von group_concat geschrieben, die für Sie nützlich sein könnte: giombetti.com/2013/06/06/mysql-group_concat

0 Stimmen

0 Stimmen

Sie können xpath verwenden, um Zeilen in Spalten zu drehen

28voto

Fedir RYKHTIK Punkte 9464

In meinem Fall hatte ich eine Reihe von Ids, und es war notwendig, sie in char umzuwandeln, da sonst das Ergebnis im Binärformat kodiert wurde:

SELECT CAST(GROUP_CONCAT(field SEPARATOR ',') AS CHAR) FROM table

20voto

Alex Bowyer Punkte 621

Ich hatte eine kompliziertere Abfrage und musste feststellen, dass ich GROUP_CONCAT in einer äußeren Abfrage, um sie zum Funktionieren zu bringen:

Ursprüngliche Anfrage:

SELECT DISTINCT userID 
FROM event GROUP BY userID 
HAVING count(distinct(cohort))=2);

Implodiert:

SELECT GROUP_CONCAT(sub.userID SEPARATOR ', ') 
FROM (SELECT DISTINCT userID FROM event 
GROUP BY userID HAVING count(distinct(cohort))=2) as sub;

Ich hoffe, dass dies jemandem helfen kann.

19voto

Shen liang Punkte 1265

Verwenden Sie die MySQL(5.6.13)-Sitzungsvariable und den Zuweisungsoperator wie folgt

SELECT @logmsg := CONCAT_ws(',',@logmsg,items) FROM temp_SplitFields a;

dann können Sie

test1,test11

2 Stimmen

Ist sie schneller als GROUP_CONCAT?

2 Stimmen

Ich habe dies unter PHPMyAdmin mit dem MySQL-Server v5.6.17 auf einem Beschreibung Spalte (varchar(50)) in einer Test Tabelle, aber sie gibt für jeden Datensatz ein BLOB-Feld zurück: SELECT @logmsg := CONCAT_ws(',',@logmsg,description) from test

14voto

Oleg Abrazhaev Punkte 2493

Für jemanden, der hier nachschaut, wie man GROUP_CONCAT mit Unterabfrage - Buchung dieses Beispiels

SELECT i.*,
(SELECT GROUP_CONCAT(userid) FROM favourites f WHERE f.itemid = i.id) AS idlist
FROM items i
WHERE i.id = $someid

Also GROUP_CONCAT muss innerhalb der Subquery verwendet werden und darf diese nicht umschließen.

10voto

thejustv Punkte 1951

Versuchen Sie dies:

DECLARE @Hobbies NVARCHAR(200) = ' '

SELECT @Hobbies = @Hobbies + hobbies + ',' FROM peoples_hobbies WHERE person_id = 5;

TL;DR;

set @sql='';
set @result='';
set @separator=' union \r\n';
SELECT 
@sql:=concat('select ''',INFORMATION_SCHEMA.COLUMNS.COLUMN_NAME  ,''' as col_name,',
INFORMATION_SCHEMA.COLUMNS.CHARACTER_MAXIMUM_LENGTH ,' as def_len ,' ,
'MAX(CHAR_LENGTH(',INFORMATION_SCHEMA.COLUMNS.COLUMN_NAME , '))as  max_char_len',
' FROM ',
INFORMATION_SCHEMA.COLUMNS.TABLE_NAME
) as sql_piece, if(@result:=if(@result='',@sql,concat(@result,@separator,@sql)),'','') as dummy
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE 
INFORMATION_SCHEMA.COLUMNS.DATA_TYPE like '%char%'
and INFORMATION_SCHEMA.COLUMNS.TABLE_SCHEMA='xxx' 
and INFORMATION_SCHEMA.COLUMNS.TABLE_NAME='yyy';
select @result;

2 Stimmen

Ich erhalte folgende Meldung: 'Unerkannter Anweisungstyp. (in der Nähe von "DECLARE" an Position 0)'

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X