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 :

Tri avant group_concat


Sujet :

Requêtes MySQL

  1. #1
    Membre habitué
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2002
    Messages
    329
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Vosges (Lorraine)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2002
    Messages : 329
    Points : 139
    Points
    139
    Par défaut Tri avant group_concat
    Bonjour,

    J'ai deux tables :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    CREATE TABLE IF NOT EXISTS tblGroupe(
    	id int(255) unsigned not null auto_increment,
    	id_createur int(255) unsigned not null, /*identité de l'enseignant qui suit la formation de ce groupe*/
    	nom varchar(200),
    	date_creation DATETIME "0000-00-00 00:00:00.0",
    	date_last_modif DATETIME "0000-00-00 00:00:00.0",
    	id_apprenti TEXT, 			
    	activite tinyint unsigned default 0,	
    	PRIMARY KEY(id)
    );
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    CREATE TABLE IF NOT EXISTS `tbladherent` (
      `id` int(255) unsigned NOT NULL auto_increment,
      `titre` varchar(10) collate latin1_general_ci NOT NULL default 'm',
      `nom` varchar(100) collate latin1_general_ci NOT NULL,
      `prenom` varchar(100) collate latin1_general_ci NOT NULL,
      `adresse` varchar(100) collate latin1_general_ci NOT NULL,
      `cp` int(10) unsigned NOT NULL,
      `ville` varchar(100) collate latin1_general_ci NOT NULL,
      `email` varchar(100) collate latin1_general_ci NOT NULL,
      `anniversaire` DATETIME "0000-00-00 00:00:00.0",
      PRIMARY KEY  (`id`)
    );
    Je cherche à afficher un tri dans ou avant le group_concat contenant une requête concat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select  GROUP_CONCAT((select CONCAT(nom,' ',prenom) from tbladherent where id=c.id_apprenti )order by a.nom SEPARATOR '<br/>') 
    as liste from tblgroupe c 
    left join tbladherent a on a.id = c.id_createur 
    GROUP BY c.nom asc;
    Cette requête fonctionne mais je ne parviens pas à trier par ordre croissant ou décroissant le contenu de GROUP_CONCAT.
    Le résultat m'est donné dans l'ordre de saisie de la table.

    J'ai bien essayé de modulé avant la focntion concat par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select  GROUP_CONCAT((select CONCAT(nom,' ',prenom) from tbladherent where id=c.id_apprenti order by nom ) SEPARATOR '<br/>')
     as liste from tblgroupe c 
    left join tbladherent a on a.id = c.id_createur 
    GROUP BY c.nom asc;
    sans plus de succès.

    Pouvez-vous m'aider, svp?

    Merci

  2. #2
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 281
    Points : 11 737
    Points
    11 737
    Par défaut
    pourquoi mettre une sous-requête dans le GROUP_CONCAT ?

    qu'est-ce que c'est que ton id_apprenti au type TEXT ?
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  3. #3
    Membre habitué
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2002
    Messages
    329
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Vosges (Lorraine)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2002
    Messages : 329
    Points : 139
    Points
    139
    Par défaut
    id_apprenti est au type int unsigned (erreur de frappe!)

    J'ai placé une sous-requête dans group_concat car je souhaite voir apparaitre le résultat de group_concat sous forme 'nom prenom<br/>nom prenom<br/>nom_prenom...'.

    Et en plus, peu s'en faut !, d'avoir un résultat trier par ordre croissant ou décroissant !!

  4. #4
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 281
    Points : 11 737
    Points
    11 737
    Par défaut
    Pour que je comprenne bien... au final, tu voudrais un truc comme ça ?

    Créateur | Apprentis
    Toto | Dupont Albert<br/>Durand Alfred<br/>Martin Astrid
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  5. #5
    Membre habitué
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2002
    Messages
    329
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Vosges (Lorraine)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2002
    Messages : 329
    Points : 139
    Points
    139
    Par défaut
    comme cela, oui

    Dupont Albert<br/>Durand Alfred<br/>Martin Astrid

    PS la requête complète dont les champs me sont d'une autre utilité est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select c.nom, a.nom, a.prenom, GROUP_CONCAT((select CONCAT(nom,' ',prenom) from tbladherent where id=c.id_apprenti) SEPARATOR '<br/>') as liste_eleve, c.date_creation, c.date_last_modif, c.id
    from tblgroupe c 
    left join tbladherent a on a.id = c.id_createur 
    GROUP BY c.nom asc;
    mais je bute sur la fonction GROUP_CONCAT !

  6. #6
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 281
    Points : 11 737
    Points
    11 737
    Par défaut
    Le GROUP_CONCAT ne s'utilise normalement pas en utilisant une sous-requête. C'est une fonction d'agrégation (qui fonctionne exactement que le SUM ou le COUNT) qui s'appuie sur le GROUP BY.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT c.nom, a.nom, a.prenom, 
      GROUP_CONCAT(CONCAT(app.nom, ' ', app.prenom) ORDER BY app.nom SEPARATOR '<br/>') AS liste_eleve, 
      c.date_creation, c.date_last_modif, c.id
    FROM tblgroupe c 
      LEFT JOIN tbladherent a ON a.id = c.id_createur 
      LEFT JOIN tbladherent app ON app.id = c.id_apprenti
    GROUP BY c.id ASC;
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  7. #7
    Membre habitué
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2002
    Messages
    329
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Vosges (Lorraine)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2002
    Messages : 329
    Points : 139
    Points
    139
    Par défaut
    Effectivement, tu viens de m'apporter la solution. Je t'en remercie beaucoup.

    Donc en fait, les fonctions d'agrégation ne peuvent être le siège de requêtes. Bon à savoir !

    Encore merci

  8. #8
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 281
    Points : 11 737
    Points
    11 737
    Par défaut
    Citation Envoyé par bastien Voir le message
    Donc en fait, les fonctions d'agrégation ne peuvent être le siège de requêtes. Bon à savoir !
    Si, à condition qu'elles ne renvoient qu'une seule ligne et qu'une seule colonne (sous requête scalaire, généralement corrélée). Mais bon, c'est une complexité inutile, a priori les fonctions d'agrég sont là pour exploiter des données du FROM selon les groupes définis par le GROUP BY.
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

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

Discussions similaires

  1. [XL-2003] Tri avant Userform
    Par Nospam54 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 26/09/2014, 09h57
  2. Réponses: 6
    Dernier message: 07/09/2013, 06h38
  3. sort écrase mon fichier avant tri
    Par slig_80 dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 05/12/2010, 17h48
  4. missing { avant try???
    Par hansaplast dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 18/03/2006, 01h24
  5. Faire un tri avant un group by
    Par Igarpoor dans le forum Requêtes
    Réponses: 10
    Dernier message: 17/03/2006, 15h27

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