IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes MySQL Discussion :

Utilisation de GROUP_CONCAT


Sujet :

Requêtes MySQL

  1. #1
    Membre habitué Avatar de ecarbill
    Homme Profil pro
    Cyberdocumentaliste
    Inscrit en
    Juin 2004
    Messages
    225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Cyberdocumentaliste
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2004
    Messages : 225
    Points : 146
    Points
    146
    Par défaut Utilisation de GROUP_CONCAT
    Bonjour,
    jai mis sur place un système de gestion de contact basé sur le principe suivant:

    Chaque personne enregistrée peut:
    - avoir ou non un ou plusieurs contact téléphonique;
    - être ou non connecté à un réseau social, ou tout autre site
    - avoir ou non une ou plusieurs photos (le lien de la photo est enregistré)
    - avoir ou non plusieurs descriptions

    Le MCD correspondant est joint en annexe.

    J’écris une requête qui ramène toutes les personnes (une seule ligne par personne quelque soit le nombre de contacts, de sites, ....). J'ai fait quelques recherches et j'ai trouver qu'il fallait utiliser GROUP_CONCAT, et voici ma requête:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     select 
        p.PERS_ID,p.PERS_NOM as nom,p.PERS_DATE_CONTACT as date_contact, com.COM_NOM AS commune, GROUP_CONCAT(DISTINCT c.contact SEPARATOR '/') contact,GROUP_CONCAT(DISTINCT cmt.DESC_LIBELLE SEPARATOR '-->' ) as commentaire , GROUP_CONCAT(DISTINCT s.SITE_NOM SEPARATOR ':::') site,GROUP_CONCAT(DISTINCT s.SITE_URL SEPARATOR ':::') lien,GROUP_CONCAT(DISTINCT cn.CON_PSEUDO SEPARATOR ':::') pseudo,GROUP_CONCAT(DISTINCT cn.CON_URL SEPARATOR ':::') profil, GROUP_CONCAT(DISTINCT photo.PHOTO_NOM SEPARATOR ':::') photo,ap.APPVALEUR note,ap.APPLIBELLE appreciation,st.RELATION_LIBELLE relation, ast.RELATION_DATE ,ast.RELATION_COMMENTAIRE raison_relation
      from 
          personne p
        LEFT JOIN (habiter h1 left join commune com on((h1.COM_ID = com.COM_ID))) ON h1.PERS_ID=p.PERS_ID
        LEFT JOIN contact c ON c.PERS_ID=p.PERS_ID
        LEFT JOIN description cmt ON cmt.PERS_ID=p.PERS_ID
        LEFT JOIN (etre_connecte cn INNER join site s on((s.SITE_ID = cn.SITE_ID))) ON cn.PERS_ID=p.PERS_ID
        LEFT JOIN photo ON photo.PERS_ID=p.PERS_ID 
        LEFT JOIN (valoir v INNER join appreciation ap on((v.APPID = ap.APPID))) ON v.PERS_ID=p.PERS_ID
        LEFT JOIN (avoir_statut ast INNER join statut st on((ast.IDSTATUT = st.IDSTATUT))) ON ast.PERS_ID=p.PERS_ID
      GROUP BY p.PERS_NOM
    Mais malgré le fait que j'utilise DISTINCT dans GROUP_CONCAT, les contacts sont dupliqués.

    Quelqu'un pourrait-il m'aider à retrouver ce qui va pas dans mon code.
    Images attachées Images attachées  
    Une somme de savoirs en chaque matière, si minime soit-elle, rend n'importe quel benêt, dans un pays de benêts, docte.

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Bonjour,


    Dans votre requete il n'y a pas de distinct.

    De toute manière en utilisant un group by vous n'aurez en résultat qu'une seule ligne par votre / vos colonne(s) de groupements.

    Si vous voyez apparaitre plusieurs lignes pour un même contact c'est que vous n'utilisez pas le group by, ou que vous l'utilisez mal.


    D'un point de vue plus générale sur le group by, MySql l'utilise d'une manière très personnelle.
    Utilisez la règle suivante et vous aurez moins de problème :

    Toute colonne non encadrée par une fonction d’agrégation (sum, max, group_concat, ...) dans la clause select doit être présente dans la clause group by.


    MySql ne suit pas cette règle et retournera une ligne dans le périmètre du group by, au hasard, pour les colonnes ne répondant pas à ce critère

  3. #3
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    Il y a bien des distinct, dans les fonctions GROUP_CONCAT...
    ça ressemble a un bug de plus pour MySQL concernant le DISTINCT.

    Essayez en ajoutant explicitement un ORDER BY (dans les fonctions GROUP_CONCAT) sur la colonne que vous concaténez...

    Est-ce que seuls vos contacts ne sont pas dedoublonnés ?

    Vous pouvez aussi supprimer les jointures, et faire des sous requêtes corrélées...

  4. #4
    Membre habitué Avatar de ecarbill
    Homme Profil pro
    Cyberdocumentaliste
    Inscrit en
    Juin 2004
    Messages
    225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Cyberdocumentaliste
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2004
    Messages : 225
    Points : 146
    Points
    146
    Par défaut
    Bonjour à tous et merci pour vos observations
    Après avoir tâtonner un peu, finalement j'ai pu résoudre le problème en prenant en compte les remarques de punkoff , c'est à dire en ajoute toutes les colonnes qui ne sont pas utilisées dans les fonctions d'agrégation

    Bon week end à tous
    Une somme de savoirs en chaque matière, si minime soit-elle, rend n'importe quel benêt, dans un pays de benêts, docte.

  5. #5
    Modérateur
    Avatar de Chtulus
    Homme Profil pro
    Ingénieur
    Inscrit en
    Avril 2008
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2008
    Messages : 3 094
    Points : 8 678
    Points
    8 678
    Par défaut
    Bonsoir ecarbill,

    Par curiosité

    - Avez vous essayé la réponse de aieeeuuuuu et si oui quel résultat (Je n'ai pas MySQL sous la main) ?

    Merci
    « Je ne cherche pas à connaître les réponses, je cherche à comprendre les questions. »
    - Confucius -

    Les meilleurs cours, tutoriels et Docs sur les SGBD et le SQL
    Tous les cours Office
    Solutions d'Entreprise



+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MySQL] Obtenir un tableau sans utiliser GROUP_CONCAT
    Par dedis dans le forum PHP & Base de données
    Réponses: 12
    Dernier message: 11/04/2011, 19h03
  2. Utilisation de GROUP_CONCAT
    Par kamaxime dans le forum Requêtes
    Réponses: 3
    Dernier message: 10/09/2010, 17h17
  3. Utilisation de group_concat avec hibernate
    Par Goupsy dans le forum Hibernate
    Réponses: 3
    Dernier message: 18/03/2010, 11h06
  4. utiliser collate avec GROUP_CONCAT
    Par GLSpirit dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 24/10/2007, 15h43
  5. Réponses: 2
    Dernier message: 20/03/2002, 23h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo