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 :

Requête imbriquée


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2010
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2010
    Messages : 19
    Points : 16
    Points
    16
    Par défaut Requête imbriquée
    Bonjour,
    je suis en train de développer un formulaire(sous forme de checkbox) selon lequel un internaute peut effectuer des recherches dans ma base selon plusieurs criteres.
    Il existe donc plusieurs combinaisons pour traiter ces requetes.
    EX:
    Choix critere 1
    rouge
    bleu
    noir
    ...
    Choix critere2
    balle de tennis
    balle ping pong
    balle foot
    .....

    L'utilisateur peut choisir plusieurs critères de Choix 1 en les combinant aux critères de Choix 2.

    J'ai donc écrit une fonction pour générer une requête en fonction des critères choisis.
    Mais je rencontre des problèmes dans d'autres fonctions qui font que je peux pas tester mon script.
    Je voudrais donc savoir pour etre rassuré est ce qu'une requête du genre :
    T1 union T2 union T3 union T4 IN (T11 union T12 union T13);
    est syntaxiquement correct.
    Les Ti representent des select id from table where colonne='attribut x'

    Merci d'avance pour vos réponses.

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

    Peut-etre pourriez-vous présenter correctement votre besoin afin que l'on vous oriente un peu mieux ? (sgbd, table, exemple de résultat voulu, ...)

  3. #3
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Points : 3 173
    Points
    3 173
    Par défaut
    T1 union T2 union T3 union T4 IN (T11 union T12 union T13);
    dans l'idée oui pour la partie de gauche mais pourriez vous précisez la partie avec le 'IN' dont je n'ai pas saisi l’intérêt.

    Précisez votre SGBD merci.

  4. #4
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2010
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2010
    Messages : 19
    Points : 16
    Points
    16
    Par défaut
    Bonjour,
    tout d'abord je vous remercie pour votre intérêt.
    J'utilise postgresql comme sgbd.
    J'ai une table entreprise qui contient: l'id de l'entreprise,nom,métier,ville, longitude,latitude (ces coordonnées géographique sont utilisés pour localiser apres l'entreprise sur la carte).
    L'utilisateur doit pouvoir effectuer une recherche par ville et/ou par metier de l'entreprise.

    Ex: je veux les coordonnées géographique des entreprises qui se trouvent dans Paris,Lille,Bordeaux dont le métier principal est : logistique,réseau,informatique.

    L'idée que j'ai eu donc ,c'est de generer en premier une requete pour chaque metier coché dans le formulaire. Puis de faire l'union entre les requetes générées pour d'autres metiers.
    Idem pour les villes.
    Et enfin pour lier la sous-requete ville avec la requete metier, j'utilise un IN.

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    donc si je comprend bien :
    une entreprise va avoir autant d’occurrence dans votre table qu'elle n'a de métier et qu'elle n'a de géolocalisation différente ....?

    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    id entr, nom, metier, ville
    1, ent1, informatique, lyon
    1, ent1, réseau, lyon
    1, ent1, informatique, paris
    1, ent1, réseau, paris
    1, ent1, logistique, paris

  6. #6
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2010
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2010
    Messages : 19
    Points : 16
    Points
    16
    Par défaut
    Oui exactement, c'est bien ca.
    Il existe peut être un autre moyen...?

  7. #7
    Membre expérimenté
    Homme Profil pro
    Ingenieur de recherche - Ecologue
    Inscrit en
    Juin 2003
    Messages
    1 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 152
    Points : 1 414
    Points
    1 414
    Par défaut
    bonjour

    ce serait bien d'avoir la structure de la (des) table(s). Mais j'ai l'impression qu'il n'y en a qu'une

    et comme le sous-entend Punkoff, il y aurait un souci dans la modelistation de la base...

    tres rapidement, il faudrait une table 'entreprise', une table 'activite', une table 'ville' et enfin une table des 'activite des entreprises'. cela permetterai de construire des requetes plus 'rigoureuses' pour un probleme, somme toute, pas si complexe

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    je dirai comme dehorter olivier.

    Vous avez un énorme problème de modélisation (edit : vu le poste que vous avez delete, c'est pas si horrible que ca.)

    Et le schéma sera plus complexe que celui annoncé juste au dessus, mais c'est un bon début.


    Mais quand vous allez avoir pas mal de données dans votre table vous allez vous tirer les cheveux pour faire vos requêtes.

    Prenons un exemple simple, notre entreprise A a 3 antennes dans paris, une qui fait de la logistique, une autre du réseau, une autre de l'informatique et du réseau, ...

    Bref si vous renoncez à changer de schéma, il faudrait poser un exemple complet, avec les données en base (fictive bien entendu) qui couvre tous les cas fonctionnels possibles + le résultat attendu.

    Et là on pourrait surement trouver une solution (bancale).

    Sinon une requête type qui pourrait vous aider dans votre recherche :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    select idEnt, ville, geoX, geoY
    from ma_table
    where metier in ('logistique', 'reseau', 'informatique')
    group by idEnt, ville, geoX, geoY
    having count(distinct metier) = 3;
    cette requête renverra toutes les entreprise qui ont ces 3 métiers.
    Après il faudra surement la recouper avec la même requête pour les villes..
    Dans le genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    select idEnt, ville, geoX, geoY
    from ma_table a
    inner join (select idEnt 
                     from ma_table
                     where ville in ('paris', 'bordeau', 'lyon')
                     group by idEnt
                     having count(distinct ville) = 3) as b on a.idEnt = b.idEnt
     
    where metier in ('logistique', 'reseau', 'informatique')
    group by idEnt, ville, geoX, geoY
    having count(distinct metier) = 3;
    Edit : je ne suis pas sur que ça couvre tout vos cas fonctionnels, c'est une piste qu'il faut développer.

  9. #9
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2010
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2010
    Messages : 19
    Points : 16
    Points
    16
    Par défaut
    Hmm, ok merci pour cette mega-requete
    Mais le bleme est que l'utilisateur peut cocher n-activités et n-villes, bon pour ce cas il y en a que 14 activités et 8 villes.
    Est ce qu'il est possible de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    SELECT idEnt, ville, geoX, geoY
    FROM ma_table a
    INNER JOIN (SELECT idEnt 
                     FROM ma_table
                     WHERE ville IN ('$v1'..'$v8')
                     GROUP BY idEnt
                     HAVING count(DISTINCT ville) = 3) AS b ON a.idEnt = b.idEnt
     
    WHERE metier IN ('$metier1'...'$metier14')
    GROUP BY idEnt, ville, geoX, geoY
    HAVING count(DISTINCT metier) = 3;
    Sachant que quelques variables $vi et $metier i peuvent ne pas etre renseignées.

  10. #10
    Membre expérimenté
    Homme Profil pro
    Ingenieur de recherche - Ecologue
    Inscrit en
    Juin 2003
    Messages
    1 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 152
    Points : 1 414
    Points
    1 414
    Par défaut
    joli punkoff

    pour scoleproj

    pour rendre cette idee plus generale (pour tenir compte du nombre variable de criteres) ce que tu ne faisait dans ta requete (j'ai un probleme dans ce type de notation ???
    '$v1'..'$v8'
    ) ????

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT idEnt, ville, geoX, geoY
    FROM ma_table
    WHERE metier IN ('logistique', 'reseau', 'informatique')
    GROUP BY idEnt, ville, geoX, geoY
    HAVING count(DISTINCT metier) = (SELECT count(DISTINCT metier
                                                       FROM ma_table
                                                      WHERE metier IN ('logistique', 'reseau', 'informatique'));

    si des familles de criteres ne sont pas selectionnees, je ne vois pas d'autres solutions que d'ecrire une requete pour chaque cas
    1 une pour ville et logistique
    1 pour logistique seule
    1 pour ville seule

    a moins que punkoff qui a l'air bien plus balaise que moi a une idee

    a+

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    c'était un exemple mais qui ne répondra pas entièrement à votre besoin actuel.

    D’ailleurs en la reprenant je vois qu'elle est fausse pour la 2eme partie, car elle pourrait sélectionner des entreprises qui n'ont pas le métier voulu dans les villes voulus ...

    Ceci est dû au manque de la table d'association ville / métier / entreprise.


    Sinon, pour en adapter le principe dans votre code il va falloir aussi changer la valeur du having count(distinct X) par votre nombre de critere de recherche.

    edit: pour votre dernière requête ne pouvez-vous pas tout simplement compter le nombre de critere dans votre liste retourné par le serveur ?


    En y repenssant il faudrai plutot voir une modélisation dans ce genre (à confirmer par quelqu'un qui à plus de bouteille que moi dans ce secteur) :

    T_entreprise (id, idEntreprise (SIRET, ..), nom, siege, ....)
    T_antenne (id, id_ent (FK sur R_entreprise), geoX, geoY, adresse, ...)
    T_metier(id, description, code (NAF / APE), ...)
    T_ville(id, nom, ...)
    R_ANTENNE_METIER(id_ant (fk antenne), id_met (fk metier))
    R_ANT_VILLE (id_vill (fk ville), id_ant (fk antenne))

    Bon avec ca on peut quadriller précisément vos besoin je penses.

    Ressortir toutes les entreprise dans une ville donnée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Select id_ant, id_ent, c.nom as "Nom Entreprise", a.nom as "Nom Ville"
    from T_VILLE a
    inner join R_ANT_VILLE b on b.id_vil = a.id
    inner join T_ENTREPRISE c on b.id_ent = c.id
    where a.nom in ('paris', 'lyon', 'bordeaux')
    De là on peut adapter ce que je vous ai donné plus haut afin de faire nos restriction sur la table R_ANT_METIER et on aura le résultat voulu.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    select id_ant
    from T_METIER a
    inner join R_ANTENNE_METIER b on b.id_met = a.id
    inner join (Select id_ant
                     from T_VILLE a
                      inner join R_ANT_VILLE b on a.id_vil = b.id
                      where a.nom in ('paris', 'lyon', 'bordeaux')
                      group by id_ant
                      having count(distinct a.id) = 3) as tmp on tmp.id_ant = b.id_ant 
     
    where a.nom in ('reseau', 'informatique', 'logistique')
    group by id_ant
    having count(distinct a.id) = 3
    Vous saisissez le principe ?

  12. #12
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2010
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2010
    Messages : 19
    Points : 16
    Points
    16
    Par défaut
    Salut,
    Desolé mais j'ai pas bien precisé le contexte, mais dans ce cas une entreprise est localisé dans 1 ville, et une entreprise n'a qu'un seul metier.
    Les attributs metier et ville dans la table entreprise sont bien des clefs étrangères => pas besoin de faire des jointures entre les tables pour retrouver la ville d'une entreprise.
    Donc du coup j'ai essayé avec cette requete qui m'a renvoyé le bon resultat:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select geox,geoy from entreprise e where e.metier IN ('reseau','logistique') and e.ville IN ('paris','lyon');
    Merci punkoff pour ton aide et ton intérêt

Discussions similaires

  1. Pb requête imbriquée
    Par ddams dans le forum Requêtes
    Réponses: 11
    Dernier message: 20/04/2004, 12h13
  2. [Requête] Faire une requête imbriquée?
    Par sekiryou dans le forum Requêtes
    Réponses: 2
    Dernier message: 17/01/2004, 22h52
  3. problème avec une requête imbriquée
    Par jaimepasteevy dans le forum Langage SQL
    Réponses: 13
    Dernier message: 05/12/2003, 10h29
  4. Requêtes imbriquées ?
    Par Ph. B. dans le forum XMLRAD
    Réponses: 7
    Dernier message: 06/05/2003, 13h19
  5. Requête imbriquée et indexes INTERBASE
    Par vadim dans le forum InterBase
    Réponses: 2
    Dernier message: 06/09/2002, 16h15

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