Mit MySQL
kann ich so etwas machen 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:
Erwartete Ausgabe:
shopping, fishing, coding
Der Grund ist, dass ich mehrere Werte aus mehreren Tabellen auswähle und nach all den Verknüpfungen viel mehr Zeilen habe, als ich möchte.
Ich habe in MySQL Doc nach einer Funktion gesucht und es sieht nicht so aus, als ob die CONCAT
oder CONCAT_WS
Funktionen Ergebnismengen akzeptieren.
Weiß hier jemand, wie man das macht?
mysql
sql
concat
group-concat
Dean Rather
quelle
quelle
Antworten:
Sie können verwenden
GROUP_CONCAT
:Wie Ludwig in seinem Kommentar feststellte , können Sie den
DISTINCT
Operator hinzufügen , um Duplikate zu vermeiden:Als Jan im angegebenen ihrem Kommentar, können Sie auch die Werte sortieren , bevor sie implodiert mit
ORDER BY
:Wie Dag in seinem Kommentar feststellte , ist das Ergebnis auf 1024 Byte begrenzt. Um dies zu lösen, führen Sie diese Abfrage vor Ihrer Abfrage aus:
Natürlich können Sie
2048
nach Ihren Wünschen ändern . So berechnen und weisen Sie den Wert zu:quelle
DISTINCT
Parameter hinzufügen , erhalten Sie keine Doppelbilder.... GROUP_CONCAT(DISTINCT hobbies)
SELECT person_id, GROUP_CONCAT(hobbies ORDER BY hobbies ASC SEPARATOR ', ') FROM peoples_hobbies GROUP BY person_id
Überprüfen Sie,
GROUP_CONCAT
ob Ihre MySQL-Version (4.1) dies unterstützt. Weitere Informationen finden Sie in der Dokumentation .Es würde ungefähr so aussehen:
quelle
group by 'all'
ist nicht notwendig (außerdem unerwünscht), da dies allen Zeilen Zeichenfolge zuweistall
und dann Zeichenfolgen zwischen diesen Zeilen vergleicht. Habe ich recht?Alternative Syntax zum Verketten mehrerer einzelner Zeilen
WARNUNG: Dieser Beitrag macht hungrig.
Gegeben:
Ich wollte mehrere einzelne Zeilen auswählen - anstelle einer Gruppe - und in einem bestimmten Feld verketten.
Angenommen, Sie haben eine Tabelle mit Produkt-IDs sowie deren Namen und Preisen:
Dann haben Sie einen ausgefallenen Ajax, der diese Welpen als Kontrollkästchen auflistet.
Ihr Benutzer für hungrige Flusspferde wählt aus
13, 15, 16
. Kein Dessert für sie heute ...Finden:
Eine Möglichkeit, die Bestellung Ihres Benutzers mit reinem MySQL in einer Zeile zusammenzufassen.
Lösung:
Verwenden Sie
GROUP_CONCAT
mit derIN
Klausel :Welche Ausgänge:
Bonuslösung:
Wenn Sie auch den Gesamtpreis möchten, werfen Sie Folgendes ein
SUM()
:PS: Entschuldigung, wenn Sie kein In-N-Out in der Nähe haben ...
quelle
Sie können die maximale Länge des
GROUP_CONCAT
Werts ändern, indem Sie dengroup_concat_max_len
Parameter einstellen .Details finden Sie in der MySQL-Dokumentation .
quelle
Es gibt eine GROUP-Aggregatfunktion, GROUP_CONCAT .
quelle
In meinem Fall hatte ich eine Reihe von IDs, und es war notwendig, sie in char umzuwandeln, andernfalls wurde das Ergebnis in ein Binärformat codiert:
quelle
CAST
ich Werte wie[BLOB - 14 Bytes]
im Ergebnis!Verwenden Sie die MySQL (5.6.13) -Sitzungsvariable und den Zuweisungsoperator wie folgt
dann kannst du bekommen
quelle
SELECT @logmsg := CONCAT_ws(',',@logmsg,description) from test
Ich hatte eine kompliziertere Abfrage und stellte fest, dass ich sie
GROUP_CONCAT
in einer äußeren Abfrage verwenden musste, damit sie funktioniert:Ursprüngliche Abfrage:
Implodiert:
Hoffe das könnte jemandem helfen.
quelle
Für jemanden, der hier sucht, wie man
GROUP_CONCAT
mit Unterabfragen arbeitet - dieses Beispiel postenSo
GROUP_CONCAT
muss in der Unterabfrage verwendet wird, nicht wickeln.quelle
Versuche dies:
quelle
Wir haben zwei Möglichkeiten, Spalten in MySql zu verketten
Oder
quelle