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

PHP & Base de données Discussion :

GROUP BY et MySQL [MySQL]


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2006
    Messages
    985
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juillet 2006
    Messages : 985
    Par défaut GROUP BY et MySQL
    Salut,
    J'ai 3 tables liées :
    table regions:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
      `region_id` int(11) NOT NULL AUTO_INCREMENT,
      `region_name` varchar(250) NOT NULL,
    table dpts:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
      `dpt_id` int(11) NOT NULL AUTO_INCREMENT,
      `region_id` int(11) NOT NULL,
    table villes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
      `ville_id` int(11) NOT NULL AUTO_INCREMENT,
      `dpt_id` int(11) NOT NULL,
    Je recherche une requête qui donne pour chaque region, les villes associées.
    Exemple : Alsace(nombre de villes) + liste des villes

    Merci d'avance...

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    Si c'est par exemple pour faire une liste déroulante, il vaut peut etre mieux recuperer les villes une à une plutot que de les rassembler dans un même champ.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre éclairé
    Inscrit en
    Février 2008
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 64
    Par défaut
    Bonjour,

    Voici une proposition

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT r.region_name,v.* FROM regions r,villes v,dpts d
    WHERE r.region_id=d.region_id AND d.dpt_id=v.dpt_id GROUP BY r.region_id
    Citation Envoyé par okoweb Voir le message
    Salut,
    J'ai 3 tables liées :
    table regions:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
      `region_id` int(11) NOT NULL AUTO_INCREMENT,
      `region_name` varchar(250) NOT NULL,
    table dpts:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
      `dpt_id` int(11) NOT NULL AUTO_INCREMENT,
      `region_id` int(11) NOT NULL,
    table villes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
      `ville_id` int(11) NOT NULL AUTO_INCREMENT,
      `dpt_id` int(11) NOT NULL,
    Je recherche une requête qui donne pour chaque region, les villes associées.
    Exemple : Alsace(nombre de villes) + liste des villes

    Merci d'avance...

  4. #4
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 814
    Billets dans le blog
    14
    Par défaut
    Avec les jointures normalisées depuis 1992, c'est mieux !
    Et pour avoir les deux résultats (comptage + liste) dans la même requête, il faut faire ceci :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT r1.region_name, tmp.nb_villes, v1.ville_name
    FROM region AS r1
    INNER JOIN (
        SELECT r.region_id, r.region_name, COUNT(v.ville_id) AS nb_villes
        FROM regions AS r
        LEFT OUTER JOIN dpts AS d ON d.region_id = r.region_id
            LEFT OUTER JOIN villes AS v ON v.dpt_id = d.dpt_id
        GROUP BY r.region_id, r.region_name
    ) AS tmp ON tmp.region_id = r1.region_id
    INNER JOIN dpts AS d1 ON d1.region_id = r1.region_id
        INNER JOIN villes AS v1 ON v.dpt_id = d1.dpt_id
    ORDER BY r1.region_name, v1.ville_name
    Si vraiment tu tiens à avoir la liste des villes en une seule colonne, bien que ce soit de la cosmétique, tu peux utiliser GROUP_CONCAT :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT r.region_id, r.region_name, 
        COUNT(v.ville_id) AS nb_villes, 
        GROUP_CONCAT(v.ville_name, ORDER BY v.ville_name, SEPARATOR ', ') AS liste_villes
    FROM regions AS r
    LEFT OUTER JOIN dpts AS d ON d.region_id = r.region_id
        LEFT OUTER JOIN villes AS v ON v.dpt_id = d.dpt_id
    GROUP BY r.region_id, r.region_name
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  5. #5
    Membre éprouvé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2006
    Messages
    985
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juillet 2006
    Messages : 985
    Par défaut
    Bjr,
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT r.region_id, r.region_name, 
        COUNT(v.ville_id) AS nb_villes, 
        GROUP_CONCAT(v.ville_name, ORDER BY v.ville_name, SEPARATOR ', ') AS liste_villes
    FROM regions AS r
    LEFT OUTER JOIN dpts AS d ON d.region_id = r.region_id
        LEFT OUTER JOIN villes AS v ON v.dpt_id = d.dpt_id
    GROUP BY r.region_id, r.region_name
    Cette requette me retourne cette erreur :
    #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'ORDER BY v.ville_name, SEPARATOR ', ') AS liste_villes FROM region AS r LEFT OUT' at line 3

  6. #6
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 814
    Billets dans le blog
    14
    Par défaut
    Au temps pour moi, il n'y a pas de virgules entre les éléments du GROUP_CONCAT :
    Documentation MySQL :
    GROUP_CONCAT(expr) Syntaxe complète :
    GROUP_CONCAT([DISTINCT] expr [,expr ...]
    [ORDER BY {unsigned_integer | col_name | formula} [ASC | DESC] [,col ...]]
    [SEPARATOR str_val])
    Cette fonction a été ajoutée en MySQL version 4.1. Elle retourne la chaîne résultant de la concaténation de toutes les valeurs du groupe :
    Donc il faut écrire le GROUP_CONCAT comme ceci je pense :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    GROUP_CONCAT(v.ville_name ORDER BY v.ville_name SEPARATOR ', ') AS liste_villes
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  7. #7
    Membre éprouvé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2006
    Messages
    985
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juillet 2006
    Messages : 985
    Par défaut
    Citation Envoyé par CinePhil Voir le message
    Au temps pour moi, il n'y a pas de virgules entre les éléments du GROUP_CONCAT :
    Documentation MySQL :
    Donc il faut écrire le GROUP_CONCAT comme ceci je pense :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    GROUP_CONCAT(v.ville_name ORDER BY v.ville_name SEPARATOR ', ') AS liste_villes
    Exactement exact

    Merci...

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

Discussions similaires

  1. Dernier id et GROUP BY dans MySQL 3.23
    Par otterley dans le forum Langage SQL
    Réponses: 5
    Dernier message: 13/02/2007, 22h30
  2. Réponses: 4
    Dernier message: 05/12/2006, 20h13
  3. [MySQL] Date - group by
    Par Baboule dans le forum Langage SQL
    Réponses: 3
    Dernier message: 13/03/2006, 22h29
  4. Requete mysql group by
    Par yobogs dans le forum Requêtes
    Réponses: 3
    Dernier message: 09/11/2005, 21h38
  5. mysql group by???
    Par rayno dans le forum Langage SQL
    Réponses: 2
    Dernier message: 20/11/2004, 12h53

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