Kann ich mehrere MySQL Zeilen in einem Feld verketten?
-
07-07-2019 - |
Frage
Mit MySQL
, ich kann so etwas tun:
SELECT hobbies FROM peoples_hobbies WHERE person_id = 5;
Meine Ausgabe:
shopping
fishing
coding
, sondern ich will nur 1 Zeile, 1 Spalte:
Erwartete Ausgabe:
shopping, fishing, coding
Der Grund dafür ist, dass ich mehrere Werte aus mehreren Tabellen bin auswählen und schließlich die Verbindungen Ich habe viel mehr Zeilen bekam als ich möchte.
Ich habe für eine Funktion sieht auf MySQL Doc und es sieht nicht wie die CONCAT
oder CONCAT_WS
Funktionen übernehmen Ergebnismengen, so hat jemand hier weiß, wie dies zu tun?
Lösung
Sie können mit GROUP_CONCAT
:
SELECT person_id, GROUP_CONCAT(hobbies SEPARATOR ', ')
FROM peoples_hobbies
GROUP BY person_id;
Wie Ludwig in seinen Kommentar, Sie können den DISTINCT
Operator hinzufügen, um Duplikate zu vermeiden:
SELECT person_id, GROUP_CONCAT(DISTINCT hobbies SEPARATOR ', ')
FROM peoples_hobbies
GROUP BY person_id;
Als Jan im ihren Kommentar, Sie können auch die Werte sortieren, bevor sie mit ORDER BY
implodiert:
SELECT person_id, GROUP_CONCAT(hobbies ORDER BY hobbies ASC SEPARATOR ', ')
FROM peoples_hobbies
GROUP BY person_id;
Wie Dag in seinen Kommentar, gibt es eine 1024-Byte-Grenze auf das Ergebnis. Um dies zu lösen, führen Sie diese Abfrage vor Ihrer Abfrage:
SET group_concat_max_len = 2048;
Natürlich können Sie 2048
nach Ihren Bedürfnissen verändern. Zu berechnen und den Wert zuweisen:
SET group_concat_max_len = CAST(
(SELECT SUM(LENGTH(hobbies)) + COUNT(*) * LENGTH(', ')
FROM peoples_hobbies
GROUP BY person_id)
AS UNSIGNED
);
Andere Tipps
Hier finden Sie aktuelle GROUP_CONCAT
wenn Ihre MySQL-Version (4.1) unterstützt. Siehe der Dokumentation mehr Details.
Es wäre in etwa so aussehen:
SELECT GROUP_CONCAT(hobbies SEPARATOR ', ')
FROM peoples_hobbies
WHERE person_id = 5
GROUP BY 'all';
Alternative Syntax verketten mehr, einzelne Zeilen
. ACHTUNG: Dieser Beitrag wird Sie hungrig
Gegeben:
Ich fand mich wollen wählen Sie mehrere, einzelne Zeilen -instead einer Gruppe-und verketten auf einem bestimmten Feld.
Angenommen, Sie haben eine Tabelle von Produkt-IDs haben und ihre Namen und Preise:
+------------+--------------------+-------+
| 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 fancy-schmancy Ajax, die diese Welpen ab, als Kontrollkästchen auflistet.
Ihr Hunger-Nilpferd Benutzer wählt 13, 15, 16
. Kein Nachtisch für sie heute ...
Suche:
Ein Weg, um Ihre Benutzer-Reihenfolge in einer Zeile zusammenfassen, mit reinem mysql.
Lösung:
Verwenden Sie GROUP_CONCAT
mit dem der 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 |
+------------------------------------------------+
Bonus Lösung:
Wenn Sie den Gesamtpreis zu wollen, wirft in In-N-Out in der Nähe haben Sie .. .
Sie können die maximale Länge des GROUP_CONCAT
Wert ändern, indem die group_concat_max_len
Parametereinstellung.
Details finden Sie in der MySQL documantation .
Es gibt eine Gruppe Aggregate-Funktion, GROUP_CONCAT .
In meinem Fall hatte ich eine Reihe von Ids, und es war notwendig, sie verkohlen zu werfen, ansonsten wurde das Ergebnis in ein binäres Format codiert:
SELECT CAST(GROUP_CONCAT(field SEPARATOR ',') AS CHAR) FROM table
Mit MySQL (5.6.13) Session-Variablen und Zuweisungsoperator wie folgt
SELECT @logmsg := CONCAT_ws(',',@logmsg,items) FROM temp_SplitFields a;
, dann können Sie erhalten
test1,test11
Ich hatte eine kompliziertere Abfrage, und fand, dass ich GROUP_CONCAT
in einer äußeren Abfrage verwenden, musste es an der Arbeit:
Original Abfrage:
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;
Hope dies könnte jemand helfen.
Versuchen Sie folgendes:
DECLARE @Hobbies NVARCHAR(200) = ' '
SELECT @Hobbies = @Hobbies + hobbies + ',' FROM peoples_hobbies WHERE person_id = 5;
Für jemanden suchen Sie hier, wie GROUP_CONCAT
verwenden, um mit Unterabfrage - dieses Beispiel veröffentlichen
SELECT i.*,
(SELECT GROUP_CONCAT(userid) FROM favourites f WHERE f.itemid = i.id) AS idlist
FROM items i
WHERE i.id = $someid
So GROUP_CONCAT
muss innerhalb der Unterabfrage verwendet werden, nicht gewickelt wird.
haben wir zwei Wege Spalten in MySql verketten
select concat(hobbies) as `Hobbies` from people_hobbies where 1
oder
select group_concat(hobbies) as `Hobbies` from people_hobbies where 1