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

2087voto

che Punkte 11861

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, können Sie die 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, können Sie die Werte auch sortieren, bevor Sie sie implodieren lassen, indem Sie 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, das Ergebnis ist auf 1024 Byte begrenzt. Um dieses Problem zu lösen, führen Sie diese Abfrage vor Ihrer Abfrage aus:

SET group_concat_max_len = 2048;

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

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

175 Stimmen

Beachten Sie jedoch die Beschränkung auf 1024 Bytes in der resultierenden Spalte (siehe Parameter Gruppe_Katalog_max_len )

87 Stimmen

Und das Hinzufügen der DISTINCT Parameter, erhalten Sie keine Doppelgänger. ... GROUP_CONCAT(DISTINCT hobbies)

126voto

lpfavreau Punkte 12203

Werfen Sie einen Blick auf GROUP_CONCAT wenn Ihre MySQL-Version (4.1) dies unterstützt. Siehe die Dokumentation für weitere Einzelheiten.

Sie würde etwa so aussehen:

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

15 Stimmen

Ich denke, dass group by 'all' ist nicht notwendig (und zudem unerwünscht), da diese allen Zeilen einen String zuweist all und vergleichen dann die Zeichenketten zwischen diesen Zeilen. Liege ich richtig?

94voto

Alternative Syntax zur Verkettung mehrere, einzelne Reihen

WARNUNG: Dieser Beitrag wird Sie hungrig machen.

Gegeben:

Ich hatte das Bedürfnis mehrere, einzelne Zeilen auswählen -anstelle einer Gruppe- und verketten Sie auf einem bestimmten Feld.

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 haben Sie einige schicke Ajax, die diese Welpen als Checkboxen auflisten.

Ihr hungrig-hippo-Benutzer wählt 13, 15, 16 . Heute gibt es keinen Nachtisch für sie...

Finden:

Eine Möglichkeit, die Bestellung eines Benutzers in einer Zeile zusammenzufassen, mit reinem mysql.

Lösung:

Utilice GROUP_CONCAT mit dem die IN Klausel :

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

Welche Ausgaben:

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

Bonuslösung:

Wenn Sie auch den Gesamtpreis wissen wollen, fügen Sie Folgendes hinzu 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 |
+------------------------------------------------+-------+

18 Stimmen

Auch wenn es sich um eine gute Antwort handelt, klingt sie mehr nach Werbung als nach einer reinen Antwort. Trotzdem ist es eine gute, gut formulierte Antwort.

0 Stimmen

In welchem Zusammenhang steht dies mit der Frage des Auftraggebers?

41voto

pau.moreno Punkte 4041

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

Siehe Einzelheiten in der MySQL-Dokumentation .

31voto

Dean Rather Punkte 30466

Es gibt eine Funktion GROUP Aggregate, GRUPPE_CONCAT .

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