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 :

Group by, sous requêtes imbriquées ?


Sujet :

Langage SQL

  1. #1
    Candidat au Club
    Homme Profil pro
    Auditeur informatique
    Inscrit en
    Juin 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Auditeur informatique

    Informations forums :
    Inscription : Juin 2014
    Messages : 4
    Points : 3
    Points
    3
    Par défaut Group by, sous requêtes imbriquées ?
    Bonjour tout le monde,

    Voila je suis bloqué sur un problème qui me semble assez simple, mais je n'arrive pas à trouver de solution optimale et je me demande s'il n'est pas possible de faire ça en une seule requête avec des GROUP BY.

    J'ai par exemple la table suivantes:
    Continent | Pays
    ---------------------------
    Europe | France
    Europe | Suisse
    Europe | Espagne
    Asie | Chine
    Asie | Japon
    Asie | Taiwan
    Afrique | Maroc
    Afrique | Mali
    ................................


    Donc voila l'exemple et moi j'aimerai obtenir deux pays de chaque continent, mais je n'arrive pas trop à voir comment je pourrais faire ça en une seule requête ou même en utilisant des requêtes imbriqués. (Ma base cible est basé sur SQLite).


    Si quelqu'un à une piste pour éviter de faire une boucle qui fait une requête pour chacun des continents je suis preneur

    Merci d'avance.

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 803
    Points
    30 803
    Par défaut
    Qu'as-tu déjà essayé comme requêtes ?
    Quel problème rencontres-tu ?
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Candidat au Club
    Homme Profil pro
    Auditeur informatique
    Inscrit en
    Juin 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Auditeur informatique

    Informations forums :
    Inscription : Juin 2014
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Basiquement, dans ma tête je pensais qu'une requête du type:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT pays FROM all_pays GROUP by continent;
    Possédait des options autres que celles arithmétiques qui me permettrais d'avoir X élements de chaque ensemble.

    Car basiquement, j'ai un code équivalent à ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    for i in executeQuery("SELECT DISTINCT contient from all_pays"):
        executeQuery('SELECT pays FROM all_pays WHERE continent = %s ORDER BY RANDOM() DESC LIMIT 3'%i)
    Et je me disait que ça doit surement être optimisable et de tout faire en SQL, mais vu qu'il doit lui même calculer le nombre d'ensemble à partir des données de la tables, je sais pas trop.
    Mais là je vois pas du tout comment faire, car le HAVING vois pas trop l'intérêt, car il m'affichera pas plus de résultat (toujours 1 par groupe), et une sous requête vois pas trop comment la former.

  4. #4
    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,

    Deux pays... n'importe lesquels ???

    Qu'en faites-vous ensuite, c'est pour de l'affichage ?

  5. #5
    Candidat au Club
    Homme Profil pro
    Auditeur informatique
    Inscrit en
    Juin 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Auditeur informatique

    Informations forums :
    Inscription : Juin 2014
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Oui, n'importe quels pays, il m'en faut juste trois de chaque ensemble.

    Mais je voulais surtout savoir s'il était possible de rendre ça générique, d'avoir X élements de X groupes dans une seule requête SQL ou s'il faut absolument passer par un traitement ultérieure dans le programme et faire X requêtes pour X groupes différents.


    Edit:


    J'ai trouvé une piste avec l'utilisation de GROUP_CONCAT qui répond à 90% de mes besoins, seulements je n'arrive pas à lui appliquer une limite, il me concatenne tout les éléments du groupe. Existe-il une macro ou autre en SQLite permettant de passer outre ça ? Une sorte de split qui me retournerais X lignes pour chaque éléments séparer par une , ?

  6. #6
    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
    Que donne ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    SELECT 
        A.continent
        ,A.pays
    FROM all_pays A
    INNER JOIN all_pays B
        ON B.continent = A.continent
        AND B.pays <= A.pays
    GROUP BY 
        A.continent
        ,A.pays
    HAVING COUNT(*) < 4

  7. #7
    Candidat au Club
    Homme Profil pro
    Auditeur informatique
    Inscrit en
    Juin 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Auditeur informatique

    Informations forums :
    Inscription : Juin 2014
    Messages : 4
    Points : 3
    Points
    3
    Par défaut Parfait
    C'est parfait, ça répond exactement à mes besoins et me facilite la vie en évitant de faire un split sur une chaine

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 09/07/2013, 16h56
  2. Jointures, group by et requête imbriquée
    Par ziyadah dans le forum Langage SQL
    Réponses: 4
    Dernier message: 17/10/2012, 15h39
  3. requêtes imbriquées sous Access
    Par Smix007 dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 19/06/2007, 14h37
  4. Optimisation de sous-requêtes imbriquées
    Par yoyoy dans le forum Requêtes
    Réponses: 3
    Dernier message: 26/01/2007, 11h45
  5. Pb de COUNT et GROUP BY simple mais sans requête imbriquées
    Par vanquish dans le forum Langage SQL
    Réponses: 3
    Dernier message: 22/10/2004, 09h45

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