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

Langage SQL Discussion :

Aidez moi pour cette requête complexe


Sujet :

Langage SQL

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 4
    Points : 2
    Points
    2
    Par défaut Aidez moi pour cette requête complexe
    Je suis entrain de travailler sur une table avec des pays et des villes.
    Chaque ville a une population.
    Comment sélectionner les 5 villes les plus peuplées de chaque pays en une requête.

    Merci d'avance pour votre aide

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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,

    Pour vous aidez, aidez nous d'abord http://www.developpez.net/forums/a69...gage-sql-lire/



  3. #3
    Membre actif Avatar de hazamor
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2008
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2008
    Messages : 179
    Points : 206
    Points
    206
    Par défaut
    tu n'a pas donné la structure de table ni le SGBD, mais tu peut s'aider de cette requête (avec mysql):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select v.NomVille
    from Ville v
    Order By v.population desc
    limit 0,5

  4. #4
    Membre actif Avatar de hazamor
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2008
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2008
    Messages : 179
    Points : 206
    Points
    206
    Par défaut
    Citation Envoyé par meritena Voir le message
    les 5 villes les plus peuplées de chaque pays en une requête.
    Excusez moi, j'ai pas bien vu cette partie, donc la requête:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    select pays, ville
    from ville v1
    where ville in ( select v2.ville
                      from ville v2
                      where v2.pays=v1.pays
                      order by population desc
                      limit 0,5)

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Pour compléter ma demande voici quelques informations complémentaires, j'aimerais effectuer cette requête sur une version de mysql 5.1.43.

    Voici une base de données exemple pour mon cas:

    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
     
    CREATE TABLE `villes` (
      `id_pays` int(11) NOT NULL,
      `population` int(11) NOT NULL,
      `nom` varchar(255) NOT NULL,
      `id` int(11) NOT NULL auto_increment,
      PRIMARY KEY  (`id`)
    );
     
    --
    -- Contenu de la table `villes`
    --
     
    INSERT INTO `villes` (`id_pays`, `population`, `nom`, `id`) VALUES
    (1, 12312, 'ville1', 1),
    (2, 22312, 'ville2', 2);
    (1, 19312, 'ville3', 3),
    (2, 22712, 'ville4', 4);
    (1, 124412, 'ville5', 5),
    (1, 223312, 'ville6', 6);
    (1, 12992, 'ville7', 7),
    (2, 223782, 'ville8', 8);
    (2, 123112, 'ville9', 9),
    (2, 223132, 'ville10', 10);
    (2, 123162, 'ville11', 11),
    (1, 223111, 'ville12', 12);

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Merci hazamor cepedant ma version de mysql répond qu'il n'est pas possible d'utiliser un LIMIT dans un sous-requête de type IN

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Le problème étant que mysql est super limité pour traiter ce genre de demande :s

    Si vous arrivez à adapter certaine requête de cet article vous pourriez vous en sortir (en particulier l'exemple 2) :
    http://sqlpro.developpez.com/article...clause-window/

  8. #8
    Membre actif Avatar de hazamor
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2008
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2008
    Messages : 179
    Points : 206
    Points
    206
    Par défaut
    essayez avec cette requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT pays, ville
    FROM ville v1
    WHERE ville IN ( SELECT v2.ville
                      FROM ville v2
                      WHERE v2.pays=v1.pays
                      and 5<(select count(*)
                                from ville v3
                                  where v2.pays=v3.pays 
                                  and v2.ville<>v3.ville
                                   and v3.population <v2.population))

  9. #9
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 910
    Points : 51 660
    Points
    51 660
    Billets dans le blog
    6
    Par défaut
    Cette requêtes ne garantie rien, car elle ne prend pas en compte les villes ex aequo, ce qui va introduire des décalages.

    Le seule façon de faire est avec RANK ou DENSE_RANK que MySQL ne supporte pas !

    A +

  10. #10
    Membre actif Avatar de hazamor
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2008
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2008
    Messages : 179
    Points : 206
    Points
    206
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    car elle ne prend pas en compte les villes ex aequo
    J'ai pas compris, est ce que tu peux m'expliquer svp?

  11. #11
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    821
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Mai 2008
    Messages : 821
    Points : 1 084
    Points
    1 084
    Par défaut
    Citation Envoyé par hazamor Voir le message
    J'ai pas compris, est ce que tu peux m'expliquer svp?
    Si la 5ème a une population de 100 et la 6ème aussi, laquelle des deux villes il faut prendre ???? si on demande de prendre les 5 premières ?

    Il faut donc travailler avec du RANK() ou du DENSE_RANK() pour pouvoir gérer
    ces égalités.

  12. #12
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 910
    Points : 51 660
    Points
    51 660
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par hazamor Voir le message
    J'ai pas compris, est ce que tu peux m'expliquer svp?
    Voici deux exemples ou votre requêtes est en échec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CREATE TABLE villes 
    ( id           int          NOT NULL PRIMARY KEY,
      id_pays      int          NOT NULL,
      population   int          NOT NULL,
      nom          varchar(255) NOT NULL);
    --> jeu d'essais n°1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    INSERT INTO villes 
    VALUES (1,  1, 2200, 'Paris'),
           (2,  1,  850, 'Marseille'),
           (3,  1,  450, 'Lyon'),
           (4,  1,  450, 'Toulouse'),
           (5,  1,  350, 'Nice'),
           (6,  1,  300, 'Nantes'),
           (7,  1,  250, 'Strasbourg'),        
           (8,  1,  250, 'Montpellier'),        
           (9,  1,  250, 'Bordeaux'),
           (10, 1,  250, 'Lille'),
           (11, 1,  200, 'Rennes'),
           (12, 1,  200, 'Reims'),
           (13, 1,  150, 'Le Havre');
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT id_pays, nom, population
    FROM   villes v1
    WHERE  nom IN (SELECT v2.nom
                   FROM   villes v2
                   WHERE  v2.id_pays = v1.id_pays
                     AND  5 < (SELECT count(*)
                               FROM   villes v3
                               WHERE  v2.id_pays = v3.id_pays 
                                 AND  v2.nom <> v3.nom
                                  AND v3.population < v2.population))     
    ORDER  BY 3 DESC
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    id_pays     nom                      population
    ----------- ------------------------ -----------
    1           Paris                    2200
    1           Marseille                850
    1           Lyon                     450
    1           Toulouse                 450
    1           Nice                     350
    1           Nantes                   300
    --> vous sortez 6 villes !!!

    --> jeu d'essais n°2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    INSERT INTO villes 
    VALUES (1,  1, 2200, 'Paris'),
           (2,  1,  850, 'Marseille'),
           (3,  1,  800, 'Lyon'),
           (4,  1,  800, 'Toulouse'),
           (5,  1,  800, 'Nice'),
           (6,  1,  800, 'Nantes'),
           (7,  1,  800, 'Strasbourg'),        
           (8,  1,  250, 'Montpellier'),        
           (9,  1,  250, 'Bordeaux'),
           (10, 1,  250, 'Lille'),
           (11, 1,  200, 'Rennes'),
           (12, 1,  200, 'Reims'),
           (13, 1,  150, 'Le Havre');
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT id_pays, nom, population
    FROM   villes v1
    WHERE  nom IN (SELECT v2.nom
                   FROM   villes v2
                   WHERE  v2.id_pays = v1.id_pays
                     AND  5 < (SELECT count(*)
                               FROM   villes v3
                               WHERE  v2.id_pays = v3.id_pays 
                                 AND  v2.nom <> v3.nom
                                  AND v3.population < v2.population))     
    ORDER  BY 3 DESC
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    id_pays     nom                        population
    ----------- -------------------------- -----------
    1           Paris                      2200
    1           Marseille                  850
    --> vous en oubliez 3 !!!

    --> solutions avec RANK() :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    WITH T AS
    (SELECT *, RANK() OVER(PARTITION BY id_pays ORDER BY population DESC) AS RANG
     FROM   villes)
    SELECT id_pays, nom, population 
    FROM   T 
    WHERE  RANG <= 5
    -- jeu d'essais n°1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    id_pays     nom                    population
    ----------- ---------------------- -----------
    1           Paris                  2200
    1           Marseille              850
    1           Lyon                   450
    1           Toulouse               450
    1           Nice                   350
    -- jeu d'essais n°2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    id_pays     nom                      population
    ----------- ------------------------ -----------
    1           Paris                    2200
    1           Marseille                850
    1           Lyon                     800
    1           Toulouse                 800
    1           Nice                     800
    1           Nantes                   800
    1           Strasbourg               800

    --> solutions avec DENSE_RANK() :

    --> jeu d'essais n°1
    id_pays nom population
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ----------- ------------------ -----------
    1           Paris              2200
    1           Marseille          850
    1           Lyon               450
    1           Toulouse           450
    1           Nice               350
    1           Nantes             300

    -- jeu d'essais n°2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    id_pays     nom                   population
    ----------- --------------------- -----------
    1           Paris                 2200
    1           Marseille             850
    1           Lyon                  800
    1           Toulouse              800
    1           Nice                  800
    1           Nantes                800
    1           Strasbourg            800
    1           Montpellier           250
    1           Bordeaux              250
    1           Lille                 250
    1           Rennes                200
    1           Reims                 200
    A +

Discussions similaires

  1. aidez moi pour cette requete
    Par bassoum dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 12/05/2008, 09h51
  2. Aidez moi pour une requête SQL server
    Par pop10 dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 19/06/2007, 22h15
  3. aidez moi pour créer cette applet svp!
    Par walid2012 dans le forum JBuilder
    Réponses: 1
    Dernier message: 11/05/2006, 14h24
  4. AIdez moi à optimiser cette requete MySQL SVP
    Par petozak dans le forum Langage SQL
    Réponses: 4
    Dernier message: 13/09/2005, 15h16
  5. Aidez-mois pour réaliser cette requete..
    Par mobeida dans le forum Langage SQL
    Réponses: 3
    Dernier message: 17/08/2005, 15h35

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