Question Puis-je concaténer plusieurs lignes MySQL dans un même champ?


En utilisant MySQL, Je peux faire quelque chose comme:

SELECT hobbies FROM peoples_hobbies WHERE person_id = 5;

Ma sortie:

shopping
fishing
coding

mais je veux juste 1 rang, 1 col:

Production attendue:

shopping, fishing, coding

La raison en est que je sélectionne plusieurs valeurs de plusieurs tables, et après toutes les jointures j'ai beaucoup plus de lignes que je le voudrais.

J'ai cherché une fonction sur MySQL Doc et il ne ressemble pas à la CONCAT ou CONCAT_WS les fonctions acceptent les ensembles de résultats, alors quelqu'un sait-il comment faire cela?


945
2017-11-10 02:34


origine


Réponses:


Vous pouvez utiliser GROUP_CONCAT:

SELECT person_id, GROUP_CONCAT(hobbies SEPARATOR ', ')
FROM peoples_hobbies GROUP BY person_id

Comme l'a déclaré Ludwig son commentaire, vous pouvez ajouter le DISTINCT opérateur pour éviter les doublons:

SELECT person_id, GROUP_CONCAT(DISTINCT hobbies SEPARATOR ', ')
FROM peoples_hobbies GROUP BY person_id

Comme l'a déclaré Jan dans leur commentaire, vous pouvez également trier les valeurs avant de l'implémenter en utilisant ORDER BY:

SELECT person_id, GROUP_CONCAT(hobbies ORDER BY hobbies ASC SEPARATOR ', ')
FROM peoples_hobbies GROUP BY person_id

Comme Dag l'a déclaré dans son commentaire, il y a une limite de 1024 octets sur le résultat. Pour résoudre ce problème, exécutez cette requête avant votre requête:

SET group_concat_max_len = 2048

Bien sûr, vous pouvez changer 2048 selon vos besoins. Pour calculer et affecter la valeur:

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

1380
2017-11-10 02:48



Jettes un coup d'oeil à GROUP_CONCAT si votre version de MySQL (4.1) le supporte. Voir La documentation pour plus de détails.

Cela ressemblerait à quelque chose comme:

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

77
2017-09-23 20:26



Syntaxe alternative pour concaténer plusieurs rangées individuelles

ATTENTION: Ce message va vous faire avoir faim.

Donné:

Je me suis trouvé vouloir sélectionner plusieurs rangées individuellesAu lieu d'un groupe et concaténer sur un certain champ.

Disons que vous avez une table des identifiants de produits et leurs noms et prix:

+------------+--------------------+-------+
| 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 |
+------------+--------------------+-------+

Ensuite, vous avez un peu d'ajax fantaisie-schmancy qui liste ces chiots comme des cases à cocher.

Votre utilisateur affamé-hippo sélectionne 13, 15, 16. Pas de dessert pour elle aujourd'hui ...

Trouver:

Une façon de résumer la commande de votre utilisateur en une seule ligne, avec mysql pur.

Solution:

Utilisation GROUP_CONCAT avec le la IN clause:

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

Quelles sorties:

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

Solution de bonus:

Si vous voulez le prix total aussi, lancez-vous 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 |
+------------------------------------------------+-------+

PS: Toutes mes excuses si vous n'avez pas de Dedans et dehors proche...


52
2018-04-08 11:32



Vous pouvez changer la longueur maximale de GROUP_CONCAT valeur en définissant la group_concat_max_len paramètre.

Voir les détails dans le Documentation MySQL.


33
2017-11-10 02:48



Il y a une fonction GROUP Aggregate, GROUP_CONCAT.


23
2018-06-10 09:24



Dans mon cas, j'avais une rangée d'IDs, et il était nécessaire de la convertir en char, sinon, le résultat était encodé en format binaire:

SELECT CAST(GROUP_CONCAT(field SEPARATOR ',') AS CHAR) FROM table

18
2017-09-27 18:47



Utilisez la variable de session et l'opérateur d'affectation MySQL (5.6.13) comme suit

SELECT @logmsg := CONCAT_ws(',',@logmsg,items) FROM temp_SplitFields a;

alors vous pouvez obtenir

test1,test11

12
2018-04-29 16:35