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 ligne, 1 col:
Production attendue:
shopping, fishing, coding
La raison en est que je sélectionne plusieurs valeurs dans plusieurs tables et, après toutes les jointures, j'ai beaucoup plus de lignes que je ne le souhaiterais.
J'ai cherché une fonction sur MySQL Doc et elle ne ressemble pas aux fonctions CONCAT
ou CONCAT_WS
acceptent les jeux de résultats.
Alors, quelqu'un ici sait-il comment faire cela?
mysql
sql
concat
group-concat
Dean plutôt
la source
la source
Réponses:
Vous pouvez utiliser
GROUP_CONCAT
:Comme Ludwig l'a déclaré dans son commentaire, vous pouvez ajouter l'
DISTINCT
opérateur pour éviter les doublons:Comme Jan l'a déclaré dans leur commentaire, vous pouvez également trier les valeurs avant de l'imploser en utilisant
ORDER BY
:Comme Dag l'a déclaré dans son commentaire, le résultat est limité à 1024 octets. Pour résoudre ce problème, exécutez cette requête avant votre requête:
Bien sûr, vous pouvez changer
2048
selon vos besoins. Pour calculer et affecter la valeur:la source
DISTINCT
paramètre, vous n'obtiendrez aucun double.... GROUP_CONCAT(DISTINCT hobbies)
SELECT person_id, GROUP_CONCAT(hobbies ORDER BY hobbies ASC SEPARATOR ', ') FROM peoples_hobbies GROUP BY person_id
Regardez
GROUP_CONCAT
si votre version MySQL (4.1) le supporte. Voir la documentation pour plus de détails.Cela ressemblerait à quelque chose comme:
la source
group by 'all'
n'est pas nécessaire (d'ailleurs indésirable), car cela affecte à toutes les lignes de chaîneall
et compare ensuite les chaînes entre ces lignes. Ai-je raison?Syntaxe alternative pour concaténer plusieurs lignes individuelles
AVERTISSEMENT: ce message vous donnera faim.
Donné:
Je me suis retrouvé à vouloir sélectionner plusieurs lignes individuelles - au lieu d'un groupe - et à concaténer sur un certain champ.
Supposons que vous ayez un tableau des identifiants des produits et leurs noms et prix:
Ensuite, vous avez un ajax fantaisie-schmancy qui répertorie ces chiots comme des cases à cocher.
Votre utilisateur hippopotame affamé sélectionne
13, 15, 16
. Pas de dessert pour elle aujourd'hui ...Trouver:
Un moyen de résumer la commande de votre utilisateur sur une seule ligne, avec pur mysql.
Solution:
À utiliser
GROUP_CONCAT
avec laIN
clause :Quelles sorties:
Solution bonus:
Si vous voulez aussi le prix total, ajoutez
SUM()
:PS: Toutes mes excuses si vous n'avez pas d' In-N-Out à proximité ...
la source
Vous pouvez modifier la longueur maximale de la
GROUP_CONCAT
valeur en définissant legroup_concat_max_len
paramètre.Voir les détails dans la documentation MySQL .
la source
Il existe une fonction GROUP Aggregate, GROUP_CONCAT .
la source
Dans mon cas, j'avais une rangée d'identifiants, et il était nécessaire de la convertir en char, sinon le résultat était encodé au format binaire:
la source
CAST
j'avais des valeurs COMME[BLOB - 14 Bytes]
dans le résultat!Utilisez la variable de session MySQL (5.6.13) et l'opérateur d'affectation comme suit
alors vous pouvez obtenir
la source
SELECT @logmsg := CONCAT_ws(',',@logmsg,description) from test
J'avais une requête plus compliquée et j'ai constaté que je devais l'utiliser
GROUP_CONCAT
dans une requête externe pour la faire fonctionner:Requête d'origine:
Implosé:
J'espère que cela pourrait aider quelqu'un.
la source
Pour quelqu'un qui regarde ici comment utiliser la
GROUP_CONCAT
sous-requête - publier cet exempleIl
GROUP_CONCAT
doit donc être utilisé à l'intérieur de la sous-requête, pas en l'enveloppant.la source
Essaye ça:
la source
nous avons deux façons de concaténer des colonnes dans MySql
Ou
la source