Maison  >  Questions et réponses  >  le corps du texte

Est-il possible de concaténer plusieurs lignes MySQL dans un seul champ ?

<p>En utilisant <code>MySQL</code>, je peux effectuer les opérations suivantes : </p> <pre class="brush:php;toolbar:false;">SELECT hobbies FROM peoples_hobbies WHERE person_id = 5;</pre> <p><strong>Ma sortie : </strong></p> <pre class="brush:php;toolbar:false;">shopping pêche codage</pre> <p>Mais je veux seulement une ligne et une colonne : </p> <p><strong>Sortie souhaitée : </strong></p> <pre class="brush:php;toolbar:false;">shopping, pêche, codage</pre> <p>La raison est que je sélectionne plusieurs valeurs dans plusieurs tables et qu'après toutes les jointures, j'obtiens plus de lignes que je ne le souhaite. </p> <p>J'ai recherché une fonction dans la documentation MySQL et il semble que les fonctions <code>CONCAT</code> ou <code>CONCAT_WS</code> </p> <p>Alors, est-ce que quelqu'un ici sait comment faire ça ? </p>
P粉556159786P粉556159786424 Il y a quelques jours457

répondre à tous(2)je répondrai

  • P粉366946380

    P粉3669463802023-08-23 12:03:30

    Si votre version MySQL (4.1) le prend en charge, vous pouvez le vérifier GROUP_CONCAT. Veuillez vous référer à la Documentation pour plus de détails.

    L'instruction de requête est la suivante :

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

    répondre
    0
  • P粉002023326

    P粉0020233262023-08-23 10:26:52

    Vous pouvez utiliser la fonction GROUP_CONCAT :

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

    Comme Ludwig l'a mentionné dans son commentaire, vous pouvez ajouter l'opérateur DISTINCT pour éviter la duplication :

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

    Comme Jan l'a mentionné dans leur commentaire, vous pouvez également trier les valeurs avant de les fusionner, 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 pour les résultats. Pour résoudre ce problème, exécutez la requête suivante avant votre requête :

    SET group_concat_max_len = 2048;

    Bien sûr, vous pouvez modifier la valeur de 2048 selon vos besoins. Voici comment calculer et attribuer des valeurs :

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

    répondre
    0
  • Annulerrépondre