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 :

Remplir une table à partir d'une requête


Sujet :

Requêtes MySQL

  1. #1
    Membre confirmé
    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
    Points : 460
    Points
    460
    Par défaut Remplir une table à partir d'une requête
    Bonjour,
    J'ai une table "deputes" qui renferme tout pour le moment et des doublons... Ca marche mais ce n'est pas bon comme conception.
    Pour le moment voici sa structure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    CREATE TABLE IF NOT EXISTS `deputes` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `noms` varchar(255) NOT NULL,
      `legislature` int(11) NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB;
    Pour le moment elle est liée à la table "legislatures" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    CREATE TABLE IF NOT EXISTS `lagislatures` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `annee_debut` date NOT NULL,
      `annee_fin` date NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB;
    Cette requête me permet de lister tous les députés, le nombre de législatures et la liste des législatures effectuées par chacun :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT noms, COUNT(lagislature) AS nbre_legislatures, 
           GROUP_CONCAT(CAST(lagislature AS CHAR) ORDER BY lagislature SEPARATOR ", " ) AS liste 
    			 FROM deputes 
    			 GROUP BY noms 
    			 ORDER BY nbre_legislatures DESC
    Pour le moment tout est okay, mais on retrouve des noms de députés qui reviennent toujours en fonction du nombre de législatures effectuées.

    Maintenant je souhaite faire une vraie bdd. Et pour le cas, cela me revient à 3 tables.

    1. table deputes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    CREATE TABLE `assnat`.`deputes` (
    `id_depute` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
    `noms` VARCHAR( 255 ) NOT NULL
    ) ENGINE = InnoDB;
    2. table legislatures
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    CREATE TABLE `assnat`.`legislatures` (
    `id_legis` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
    `date_debut` DATE NOT NULL ,
    `date_fin` DATE NOT NULL
    ) ENGINE = InnoDB;
    3. table depute_legislatures
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    CREATE TABLE `assnat`.`depute_legislatures` (
    `id_depute` INT NOT NULL ,
    `id_legis` INT NOT NULL
    ) ENGINE = InnoDB;
    Je souhaite donc savoir comment remplir dynamiquement à partir d'une requête sur la table initial les tables deputes et depute_legislatures de la seconde structure.

    NB. Volontairement j'ai laissé de coté les contraintes pour ne pas saturer la problématique.

    Merci d'avance...

  2. #2
    Membre confirmé
    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
    Points : 460
    Points
    460
    Par défaut
    Le problème a été posé ci haut, mais pour être plus simple, est-ce on peut imbriquer un INSERT INTO dans un SELECT de cette manière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT noms FROM deputes1 ORDER BY noms 
    // et pour chaque ligne de résultat de SELECT faire
    INSERT INTO deputes2 (id, noms2) VALUES ('', deputes.noms)
    Je ne sais pas si j'ai été claire?

  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

    Commencez par inserer dans la table deputs la liste des députés :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    INSERT INTO assnat.deputes(noms)
    SELECT DISTINCT noms 
    FROM deputes

    Ensuite, faites de meme pour la table legislature

    enfin, pour peupler la table depute_legislatures :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    INSERT INTO assnat.depute_legislatures (id_depute, id_legis)
    SELECT id, legislature
    FROM deputes

    ces requêtes doivent être lancées sur l'ancienne instance

    je vous conseille de vérifier avant ca que vous n'avez pas de députés écrit de deux façons différentes pour le même député, auquel cas vous aurez deux lignes dans la table finale deputes pour un seul et même deputé. ( à vérifier également pour la table legislature, mais c'est moins probable !)

  4. #4
    Membre confirmé
    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
    Points : 460
    Points
    460
    Par défaut
    Citation Envoyé par aieeeuuuuu Voir le message
    ...
    Exactement exact. Merci

    Mais comment refaire cette requête sur la nouvelle base :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT noms, COUNT(lagislature) AS nbre_legislatures, 
           GROUP_CONCAT(CAST(lagislature AS CHAR) ORDER BY lagislature SEPARATOR ", " ) AS liste 
    			 FROM deputes 
    			 GROUP BY noms 
    			 ORDER BY nbre_legislatures DESC

  5. #5
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT d.noms, 
        COUNT(*) AS nbre_legislatures,
        GROUP_CONCAT(CAST(id_legis AS CHAR) ORDER BY id_legis SEPARATOR ',') AS liste
    FROM deputes AS d
    INNER JOIN depute_legislatures AS dl ON dl.id_depute = d.id_depute
    GROUP BY d.noms
    ORDER BY COUNT(*)
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    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 !

  6. #6
    Membre confirmé
    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
    Points : 460
    Points
    460
    Par défaut
    Citation Envoyé par CinePhil Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT d.noms, 
        COUNT(*) AS nbre_legislatures,
        GROUP_CONCAT(CAST(id_legis AS CHAR) ORDER BY id_legis SEPARATOR ',') AS liste
    FROM deputes AS d
    INNER JOIN depute_legislatures AS dl ON dl.id_depute = d.id_depute
    GROUP BY d.noms
    ORDER BY COUNT(*)
    Merci, mais c'est pas encore le résultat attendu j'ai ceci pour cette requete
    noms : Jean paul, nbre_legislatures : 1, liste : 8
    Pourtant je m'attendais à ceci :
    noms : Jean paul , nbre_legislatures : 7, liste: 1, 2, 3, 5, 6, 7, 8
    Vous remarquez ce n'est pas bon.

    Merci d'avance...

  7. #7
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Ne connaissant pas le contenu de la table, je ne peux pas dire si le résultat est juste ou pas mais en tout cas il est cohérent :
    MySQL a compté une législature pour Jean Paul et il a donné son numéro : 8.

    Pour vérifier, fais cette requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT COUNT(*)
    FROM depute_legislatures
    WHERE id_depute =
    (
        SELECT id_depute
        FROM deputes
        WHERE noms = 'Jean Paul'
    )
    Ou encore celle-ci qui devrait donner le même résultat et qui est plus jolie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT COUNT(*)
    FROM depute_legislatures AS dl
    INNER JOIN deputes AS d ON d.id_depute = dl.id_depute
    WHERE d.noms = 'Jean Paul'
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    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 !

  8. #8
    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
    une piste, mais vu l'origine des données, c'est a vérifier (en fait c'est ce dont je parle dans mon premier post) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    'Jean Paul' != 'Jean-Paul'

  9. #9
    Membre confirmé
    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
    Points : 460
    Points
    460
    Par défaut
    Effectivement le problème vient des données de la table depute_legislatures qui a été mal remplie par la requete suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    INSERT INTO assnat.depute_legislatures (id_depute, id_legis)
    SELECT id, legislature
    FROM deputes
    Je coince toujours à ce niveau.

    Merci d'avance...

  10. #10
    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
    arff, oui !

    Je suis allé un peu vite
    Les ID sont ceux de l'ancienne base, il faut donc chercher les correspondances.
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    INSERT INTO assnat.depute_legislatures (id_depute, id_legis)
    SELECT newdeputes.id, newlegislatures.id
    FROM deputes
    INNER JOIN legislature 
        ON legislature.id = deputes.id
    INNER JOIN assnat.deputes newdeputes 
        ON deputes.nom = newdeputes.nom
    INNER JOIN assnat.legislature newlegislature 
        ON legislature.date_debut = newlegislature.date_debut 
        AND legislature.date_fin = newlegislature.date_fin

    en supposant que vous n'avez pas plusieurs législatures avec les mêmes date de début et fin

  11. #11
    Membre confirmé
    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
    Points : 460
    Points
    460
    Par défaut
    La correspondance des tables et champs me donne ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    INSERT INTO assnat.depute_legislatures (id_depute, id_legis)
    SELECT newdeputes.id, newlegislatures.id
    FROM deputes
    INNER JOIN legislatures 
        ON legislatures.id = deputes.id
    INNER JOIN assnat.deputes newdeputes 
        ON deputes.noms = newdeputes.noms
    INNER JOIN assnat.legislatures newlegislature 
        ON legislatures.date_debut = newlegislature.date_debut 
        AND legislatures.date_fin = newlegislature.date_fin
    Et j'ai cette erreur :
    #1054 - Unknown column 'newdeputes.id' in 'field list'
    Qu'est-ce qui ne va pas?

    Merci d'avance...

  12. #12
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Comme ceci, je pense que ça ira mieux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    -- Vidage des nouvelles tables
    DELETE FROM assnat.deputes;
    DELETE FROM assnat.legislatures;
    DELETE FROM assnat.depute_legislatures;
     
    -- Réinitialisation des auto_incrémentations
    ALTER TABLE assnat.deputes
    AUTO_INCREMENT = 0;
     
    ALTER TABLE assnat.legislatures
    AUTO_INCREMENT = 0;
     
    ALTER TABLE assnat.depute_legislatures
    AUTO_INCREMENT = 0;
     
    -- Remplissage des nouvelles tables
    INSERT INTO assnat.deputes (noms)
    SELECT DISTINCT noms
    FROM deputes
    ORDER BY noms;
     
    INSERT INTO assnat.legislatures (date_debut, date_fin)
    SELECT DISTINCT annee_debut, annee_fin
    FROM lagislatures
    ORDER BY annee_debut, annee_fin;
     
    INSERT INTO assnat.depute_legislatures (id_depute, id_legis)
    SELECT DISTINCT d.id_depute, l.id_legis
    FROM deputes AS d1
    INNER JOIN assnat.deputes AS d ON d.noms = d1.noms
    INNER JOIN lagislatures AS l1 ON l1.id_legis = d1.legislature
        INNER JOIN assnat.legislatures AS l ON l.date_debut = l1.annee_debut AND l.date_fin = l1.annee_fin
    ORDER BY d.id_depute, l.id_legis;
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    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 !

  13. #13
    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
    Effectivement, d'après ce que vous aviez posté, cette colonne s'appelle id_depute

    remplacez donc dans la requete les newdeputes.id par newdepute.id_depute

  14. #14
    Membre confirmé
    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
    Points : 460
    Points
    460
    Par défaut
    Citation Envoyé par CinePhil Voir le message
    Comme ceci, je pense que ça ira mieux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    -- Vidage des nouvelles tables
    DELETE FROM assnat.deputes;
    DELETE FROM assnat.legislatures;
    DELETE FROM assnat.depute_legislatures;
     
    -- Réinitialisation des auto_incrémentations
    ALTER TABLE assnat.deputes
    AUTO_INCREMENT = 0;
     
    ALTER TABLE assnat.legislatures
    AUTO_INCREMENT = 0;
     
    ALTER TABLE assnat.depute_legislatures
    AUTO_INCREMENT = 0;
     
    -- Remplissage des nouvelles tables
    INSERT INTO assnat.deputes (noms)
    SELECT DISTINCT noms
    FROM deputes
    ORDER BY noms;
     
    INSERT INTO assnat.legislatures (date_debut, date_fin)
    SELECT DISTINCT annee_debut, annee_fin
    FROM lagislatures
    ORDER BY annee_debut, annee_fin;
     
    INSERT INTO assnat.depute_legislatures (id_depute, id_legis)
    SELECT DISTINCT d.id_depute, l.id_legis
    FROM deputes AS d1
    INNER JOIN assnat.deputes AS d ON d.noms = d1.noms
    INNER JOIN lagislatures AS l1 ON l1.id_legis = d1.legislature
        INNER JOIN assnat.legislatures AS l ON l.date_debut = l1.annee_debut AND l.date_fin = l1.annee_fin
    ORDER BY d.id_depute, l.id_legis;
    Exactement exact.

    Merci...

  15. #15
    Membre confirmé
    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
    Points : 460
    Points
    460
    Par défaut
    Bonsoir,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT deputes.noms as depute, COUNT(depute_legislatures.id_legis) as total_legis, GROUP_CONCAT(CAST(depute_legislatures.id_legis AS CHAR) ORDER BY depute_legislatures.id_legis SEPARATOR ", " ) AS liste
            FROM deputes
    				INNER JOIN depute_legislatures ON depute_legislatures.id_depute = deputes.id_depute
    				GROUP BY depute_legislatures.id_depute 
    				ORDER BY total_legis DESC, deputes.noms
    Cette requete me donne la liste des députés, le nombre de législatures effectuées et la liste de ces législatures.
    Exemple :
    Noms : Jean paul, Nombre de législatures :3 et liste des législature 6 | 7 | 8
    Maintenant je souhaite ressortir cette liste pour une suite de législature et j'ai ajouté cette restriction pour 7 et 8 pour ceux qui ont fait 7 et 8..
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    WHERE depute_legislatures.id_legis IN (7,8)
    J'ai plutôt comme résultat la liste des députés qui ont fait les législatures 7 et 8 et ceux qui ont fait uniquement la 8 législature.

    Merci d'avance...

  16. #16
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Coup classique !
    Si tu veux les députés qui ont fait au moins la 7 et la 8, il faut filtrer comme tu l'as fait avec IN(7, 8) et compter le nombre de lignes de résultat par députés en ne gardant que ceux qui ont au moins deux lignes.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT deputes.noms AS depute, 
      COUNT(depute_legislatures.id_legis) AS total_legis, 
      GROUP_CONCAT(CAST(depute_legislatures.id_legis AS CHAR) ORDER BY depute_legislatures.id_legis SEPARATOR ", " ) AS liste
    FROM deputes
    INNER JOIN depute_legislatures ON depute_legislatures.id_depute = deputes.id_depute
    WHERE WHERE depute_legislatures.id_legis IN (7,8)
    GROUP BY depute_legislatures.id_depute 
    HAVING COUNT(*) > 1
    ORDER BY total_legis DESC, deputes.noms
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    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 !

  17. #17
    Membre confirmé
    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
    Points : 460
    Points
    460
    Par défaut
    Citation Envoyé par CinePhil Voir le message
    Coup classique !
    Si tu veux les députés qui ont fait au moins la 7 et la 8, il faut filtrer comme tu l'as fait avec IN(7, 8) et compter le nombre de lignes de résultat par députés en ne gardant que ceux qui ont au moins deux lignes.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT deputes.noms AS depute, 
      COUNT(depute_legislatures.id_legis) AS total_legis, 
      GROUP_CONCAT(CAST(depute_legislatures.id_legis AS CHAR) ORDER BY depute_legislatures.id_legis SEPARATOR ", " ) AS liste
    FROM deputes
    INNER JOIN depute_legislatures ON depute_legislatures.id_depute = deputes.id_depute
    WHERE WHERE depute_legislatures.id_legis IN (7,8)
    GROUP BY depute_legislatures.id_depute 
    HAVING COUNT(*) > 1
    ORDER BY total_legis DESC, deputes.noms
    Exactement exact maitre , merci...

  18. #18
    Membre confirmé
    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
    Points : 460
    Points
    460
    Par défaut
    Pour mes besoins, j'ai modifié ainsi ma table depute_legislatures
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    CREATE TABLE IF NOT EXISTS `depute_legislatures` (
      `id_depute` int(11) NOT NULL,
      `id_legis` int(11) NOT NULL,
      `id_parti` int(11) NOT NULL,
      `suppleant` int(11) NOT NULL,
      `decede` int(11) NOT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
    et cette dernière est liée à partis_politiques
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    CREATE TABLE IF NOT EXISTS `partis_politiques` (
      `id_parti` int(11) NOT NULL AUTO_INCREMENT,
      `sigle` varchar(255) NOT NULL,
      `logo` varchar(255) NOT NULL,
      PRIMARY KEY (`id_parti`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=latin1;
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT partis_politiques.sigle, count(depute_legislatures.id_depute) as nb_deputes FROM `legislatures` 
    INNER JOIN depute_legislatures ON depute_legislatures.id_legis = legislatures.id_legis
    INNER JOIN partis_politiques ON depute_legislatures.id_parti = partis_politiques.id_parti
    WHERE depute_legislatures.id_legis = 8
    GROUP BY depute_legislatures.id_parti 
    ORDER BY nb_deputes DESC;
    cette requête me donne le nombre de députés que compte chaque parti politique par législature et ca roule super bien.

    Ce que je souhaite maintenant faire c'est dans la même requête ressortir le nombre total de députés pour une législature donnée qui est en faite la somme des nombres de députés que compte chaque parti.
    Je pense avoir été clair.

    merci d'avance...

  19. #19
    Membre confirmé
    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
    Points : 460
    Points
    460
    Par défaut
    Citation Envoyé par okoweb Voir le message
    Ce que je souhaite maintenant faire c'est dans la même requête ressortir le nombre total de députés pour une législature donnée qui est en faite la somme des nombres de députés que compte chaque parti.
    Je pense avoir été clair.
    J'ai essayé ceci, ca ne donne pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT SUM(count(depute_legislatures.id_depute)) as nb_deputes FROM `legislatures` 
    INNER JOIN depute_legislatures ON depute_legislatures.id_legis = legislatures.id_legis
    WHERE depute_legislatures.id_legis = 8
    GROUP BY depute_legislatures.id_parti;
    j'obtiens cet erreur :
    #1111 - Invalid use of group function
    ca veut dire quoi?

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 22/06/2012, 12h12
  2. Remplir une table à partir d'une requête
    Par belorom dans le forum WinDev
    Réponses: 6
    Dernier message: 12/05/2010, 14h08
  3. Réponses: 7
    Dernier message: 05/06/2008, 13h54
  4. [Tables] Update d'une table à partir d'une autre
    Par le_niak dans le forum VBA Access
    Réponses: 2
    Dernier message: 17/01/2008, 09h01
  5. copie d'une table Y d'une base A vers une table X d'une base
    Par moneyboss dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 30/08/2005, 21h24

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