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

2voto

raghavendra Punkte 49

Wir haben zwei Möglichkeiten, Spalten in MySql zu verketten

select concat(hobbies) as `Hobbies` from people_hobbies where 1

Oder

select group_concat(hobbies) as `Hobbies` from people_hobbies where 1

2voto

Muhammad Shahzad Punkte 8494

Es ist spät, aber hilfreich für diejenigen, die "mehrere MySQL-Zeilen in ein Feld mit Pivot-Tabelle verketten" suchen :)

Abfrage:

SELECT pm.id, pm.name, GROUP_CONCAT(c.name) as channel_names
FROM payment_methods pm
LEFT JOIN payment_methods_channels_pivot pmcp ON pmcp.payment_method_id = pm.id
LEFT JOIN channels c ON c.id = pmcp.channel_id
GROUP BY pm.id

Tische

payment_methods 
  id  | name
  1   | PayPal

channels
  id  | name
  1   | Google
  2   | Faceook

payment_methods_channels_pivot
   payment_method_id | channel_id
   1                 |  1
   1                 |  2

Ausgabe:

enter image description here

1 Stimmen

GROUP_CONCAT(c.name) funktioniert die Verkettung mehrerer Zeilen in einer Spalte

2voto

Hier war meine Absicht, die String-Verkettung ohne die Funktion group_concat() anzuwenden:

Set @concatHobbies = '';
SELECT TRIM(LEADING ', ' FROM T.hobbies ) FROM 
(
   select 
   Id, @concatHobbies := concat_ws(', ',@concatHobbies,hobbies) as hobbies
   from peoples_hobbies
)T
Order by Id DESC
LIMIT 1

Hier

   select 
   Id, @concatHobbies := concat_ws(', ',@concatHobbies,hobbies) as hobbies
   from peoples_hobbies

wird zurückgegeben

  Id    hobbies
  1     , shopping
  2     , shopping, fishing
  3     , shopping, fishing, coding

Unser erwartetes Ergebnis steht nun an dritter Stelle. Ich nehme also die letzte Zeile, indem ich

  Order by Id DESC 
  LIMIT 1

Dann entferne ich auch das erste ', ' aus meiner Zeichenkette

 TRIM(LEADING ', ' FROM T.hobbies )

1voto

Payel Senapati Punkte 716

Ein weiteres interessantes Beispiel in diesem Fall -

Der Aufbau der Beispieltabelle ist wie folgt people_hobbies -

DESCRIBE people_hobbies;
+---------+--------------+------+-----+---------+----------------+
| Field   | Type         | Null | Key | Default | Extra          |
+---------+--------------+------+-----+---------+----------------+
| id      | int unsigned | NO   | PRI | NULL    | auto_increment |
| ppl_id  | int unsigned | YES  | MUL | NULL    |                |
| name    | varchar(200) | YES  |     | NULL    |                |
| hby_id  | int unsigned | YES  | MUL | NULL    |                |
| hobbies | varchar(50)  | YES  |     | NULL    |                |
+---------+--------------+------+-----+---------+----------------+

Die Tabelle wird wie folgt ausgefüllt -

SELECT * FROM people_hobbies;
+----+--------+-----------------+--------+-----------+
| id | ppl_id | name            | hby_id | hobbies   |
+----+--------+-----------------+--------+-----------+
|  1 |      1 | Shriya Jain     |      1 | reading   |
|  2 |      4 | Shirley Setia   |      4 | coding    |
|  3 |      2 | Varsha Tripathi |      7 | gardening |
|  4 |      3 | Diya Ghosh      |      2 | fishing   |
|  5 |      4 | Shirley Setia   |      3 | gaming    |
|  6 |      1 | Shriya Jain     |      6 | cycling   |
|  7 |      2 | Varsha Tripathi |      1 | reading   |
|  8 |      3 | Diya Ghosh      |      5 | shopping  |
|  9 |      3 | Diya Ghosh      |      4 | coding    |
| 10 |      4 | Shirley Setia   |      1 | reading   |
| 11 |      1 | Shriya Jain     |      4 | coding    |
| 12 |      1 | Shriya Jain     |      3 | gaming    |
| 13 |      4 | Shirley Setia   |      2 | fishing   |
| 14 |      4 | Shirley Setia   |      7 | gardening |
| 15 |      2 | Varsha Tripathi |      3 | gaming    |
| 16 |      2 | Varsha Tripathi |      2 | fishing   |
| 17 |      1 | Shriya Jain     |      5 | shopping  |
| 18 |      1 | Shriya Jain     |      7 | gardening |
| 19 |      3 | Diya Ghosh      |      1 | reading   |
| 20 |      4 | Shirley Setia   |      5 | shopping  |
+----+--------+-----------------+--------+-----------+

Nun, eine Tabelle hobby_list wird eine Liste aller Personen und eine Liste der Hobbys der einzelnen Personen erstellt, wobei jedes Hobby in einer neuen Zeile steht -

CREATE TABLE hobby_list AS
    -> SELECT ppl_id, name,
    -> GROUP_CONCAT(hobbies ORDER BY hby_id SEPARATOR "\n")
    -> AS hobbies
    -> FROM people_hobbies
    -> GROUP BY ppl_id
    -> ORDER BY ppl_id;

SELECT * FROM hobby_list;

CONCAT_GROUP()

0voto

Golden Lion Punkte 2590

In Sql-Server verwenden Sie string_agg, um die Werte eines Zeilenfeldes in eine Spalte zu drehen:

select string_agg(field1, ', ') a FROM mytable 

or

select string_agg(field1, ', ') within group (order by field1 dsc) a FROM mytable group by field2

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