Frage Kann ich mehrere MySQL-Zeilen in einem Feld verketten?


Verwenden MySQLIch kann etwas tun wie:

SELECT hobbies FROM peoples_hobbies WHERE person_id = 5;

Meine Ausgabe:

shopping
fishing
coding

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

Erwartete Ausgabe:

shopping, fishing, coding

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

Ich habe nach einer Funktion gesucht MySQL Doc und es sieht nicht so aus CONCAT oder CONCAT_WS Funktionen akzeptieren Ergebnismengen, weiß also jeder hier, wie man das macht?


945
2017-11-10 02:34


Ursprung


Antworten:


Sie können verwenden GROUP_CONCAT:

SELECT person_id, GROUP_CONCAT(hobbies SEPARATOR ', ')
FROM peoples_hobbies GROUP BY person_id

Wie Ludwig in sein Kommentar, Sie können das hinzufügen DISTINCT Operator, um Duplikate zu vermeiden:

SELECT person_id, GROUP_CONCAT(DISTINCT hobbies SEPARATOR ', ')
FROM peoples_hobbies GROUP BY person_id

Wie Jan in ihr Kommentar, Sie können die Werte auch sortieren, bevor Sie sie implodieren ORDER BY:

SELECT person_id, GROUP_CONCAT(hobbies ORDER BY hobbies ASC SEPARATOR ', ')
FROM peoples_hobbies GROUP BY person_id

Wie Dag in sein Kommentar, Für das Ergebnis gibt es eine 1024-Byte-Grenze. Führen Sie diese Abfrage vor Ihrer Abfrage aus, um das Problem zu lösen:

SET group_concat_max_len = 2048

Natürlich können Sie ändern 2048 nach Ihren Bedürfnissen. Um den Wert zu berechnen und zuzuweisen:

SET group_concat_max_len = CAST(
    (SELECT SUM(LENGTH(hobbies)) + COUNT(*) * LENGTH(', ')
    FROM peoples_hobbies GROUP BY person_id)
    AS UNSIGNED
)

1380
2017-11-10 02:48



Schau es dir an GROUP_CONCAT wenn Ihre MySQL-Version (4.1) dies unterstützt. Sehen die Dokumentation für mehr Details.

Es würde ungefähr so ​​aussehen:

  SELECT GROUP_CONCAT(hobbies SEPARATOR ', ') 
  FROM peoples_hobbies 
  WHERE person_id = 5 
  GROUP BY 'all';

77
2017-09-23 20:26



Alternative Syntax zum Verketten mehrere, einzelne Zeilen

WARNUNG: Dieser Beitrag macht hungrig.

Gegeben:

Ich wollte es selbst tun Wählen Sie mehrere einzelne Zeilen aus- anstelle einer Gruppe - und verketten auf einem bestimmten Gebiet.

Nehmen wir an, Sie haben eine Tabelle mit Produkt-IDs und deren Namen und Preisen:

+------------+--------------------+-------+
| product_id | name               | price |
+------------+--------------------+-------+
|         13 | Double Double      |     5 |
|         14 | Neapolitan Shake   |     2 |
|         15 | Animal Style Fries |     3 |
|         16 | Root Beer          |     2 |
|         17 | Lame T-Shirt       |    15 |
+------------+--------------------+-------+

Dann hast du eine schicke Ajax, die diese Welpen als Checkboxen anzeigt.

Dein hungriger Flusspferd wählt aus 13, 15, 16. Kein Dessert für sie heute ...

Finden:

Eine Möglichkeit, die Reihenfolge Ihres Benutzers in einer Zeile mit reinem MySQL zusammenzufassen.

Lösung:

Benutzen GROUP_CONCAT mit dem das IN Klausel:

mysql> SELECT GROUP_CONCAT(name SEPARATOR ' + ') AS order_summary FROM product WHERE product_id IN (13, 15, 16);

Welche Ausgänge:

+------------------------------------------------+
| order_summary                                  |
+------------------------------------------------+
| Double Double + Animal Style Fries + Root Beer |
+------------------------------------------------+

Bonuslösung:

Wenn Sie den Gesamtpreis auch wollen, werfen Sie ein SUM():

mysql> SELECT GROUP_CONCAT(name SEPARATOR ' + ') AS order_summary, SUM(price) AS total FROM product WHERE product_id IN (13, 15, 16);
+------------------------------------------------+-------+
| order_summary                                  | total |
+------------------------------------------------+-------+
| Double Double + Animal Style Fries + Root Beer |    10 |
+------------------------------------------------+-------+

PS: Entschuldigung, wenn du keine hast Rein und raus in der Nähe...


52
2018-04-08 11:32



Sie können die maximale Länge der GROUP_CONCAT Wert durch Setzen der group_concat_max_len Parameter.

Siehe Details in der MySQL-Dokumentation.


33
2017-11-10 02:48



Es gibt eine GROUP-Aggregatfunktion, GROUP_CONCAT.


23
2018-06-10 09:24



In meinem Fall hatte ich eine Reihe von Ids, und es war notwendig, es in Char zu konvertieren, ansonsten wurde das Ergebnis in Binärformat codiert:

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

18
2017-09-27 18:47



Verwenden Sie MySQL (5.6.13) Sitzungsvariable und Zuweisungsoperator wie folgt

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

dann kannst du bekommen

test1,test11

12
2018-04-29 16:35



Ich hatte eine kompliziertere Anfrage und stellte fest, dass ich sie verwenden musste GROUP_CONCAT in einer äußeren Abfrage, um es zum Laufen zu bringen:

Ursprüngliche Suchanfrage:

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;

Hoffe, das könnte jemandem helfen.


9
2018-02-26 15:25



Versuche dies:

DECLARE @Hobbies NVARCHAR(200) = ' '

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

4