group-concat d'une - Puis-je concaténer plusieurs lignes MySQL dans un même champ?




server concatener (9)

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?


Answers

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 .


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


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é ...


Jetez un oeil à GROUP_CONCAT si votre version de MySQL (4.1) le supporte. Voir GROUP_CONCAT 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';

Vous pouvez utiliser GROUP_CONCAT :

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

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

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

Comme Jan l'a déclaré dans son 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
)

Essaye ça:

DECLARE @Hobbies NVARCHAR(200) = ' '

SELECT @Hobbies = @Hobbies + hobbies + ',' FROM peoples_hobbies WHERE person_id = 5;

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.


SET  @num := 0;

UPDATE your_table SET id = @num := (@num+1);

ALTER TABLE your_table AUTO_INCREMENT =1;

Je pense que ça va le faire





mysql sql concat group-concat