mysql - group_concat - sql server concatener les valeurs d'une colonne




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

Syntaxe alternative pour concaténer plusieurs lignes individuelles

ATTENTION: Ce message va vous faire avoir faim.

Donné:

Je me suis trouvé vouloir vouloir sélectionner plusieurs rangées individuelles - au 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:

Utilisez GROUP_CONCAT avec la clause IN :

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 aussi le prix total, lancez dans 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 d' In-N-Out à proximité ...

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 semble pas que les fonctions CONCAT ou CONCAT_WS acceptent les ensembles de résultats, alors quelqu'un sait-il comment faire?


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


J'ai eu une requête plus compliquée, et j'ai trouvé que je devais utiliser GROUP_CONCAT dans une requête externe pour le faire fonctionner:

Requête originale:

SELECT DISTINCT userID 
FROM event GROUP BY userID 
HAVING count(distinct(cohort))=2);

Implosé:

SELECT GROUP_CONCAT(sub.userID SEPARATOR ', ') 
FROM (SELECT DISTINCT userID FROM event 
GROUP BY userID HAVING count(distinct(cohort))=2) as sub;

J'espère que cela pourrait aider quelqu'un.


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

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

Voir les détails dans la documentation de GROUP_CONCAT .





group-concat