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?

War es hilfreich?

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top