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 :

Problème de requête SQL entre tables


Sujet :

Langage SQL

  1. #1
    Candidat au Club
    Femme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2011
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2011
    Messages : 3
    Points : 3
    Points
    3
    Par défaut Problème de requête SQL entre tables
    Bonjour à tous,
    Je dois créer un module de recherche à partir d'une BDD SQL.
    Voici mes tables:
    poste(NumPays_p, intitule, etc)
    stages(NumPays_s, titre, etc)
    apprentissage(NumPays_a, titre, etc)
    pays(NumPays, Pays)

    J'ai beaucoup de pays dans la table pays qui n'ont actuellement aucun poste ou stage ou apprentissage correspondant.
    Je voudrais sortir la liste distincte des pays qui ont au moins un poste ou un apprentissage ou un stage.

    J'ai essayé plusieurs requêtes mais soit elles sortent un résultat incohérent soit elles sont syntaxiquement erronées.

    Merci beaucoup pour votre aide.

  2. #2
    Membre émérite Avatar de lola06
    Femme Profil pro
    Consultante en Business Intelligence
    Inscrit en
    Avril 2007
    Messages
    1 316
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 37
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultante en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 316
    Points : 2 520
    Points
    2 520
    Par défaut
    Bonjour,

    Il faudrait que tu nous précise ton SGBD et que tu nous mettes les requêtes que tu as déjà construites (même si elles sont fausses)

  3. #3
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 950
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par sarahg77100 Voir le message
    Je voudrais sortir la liste distincte des pays qui ont au moins un poste ou un apprentissage ou un stage.
    Avec OR EXISTS :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    select NumPays, Pays
      from pays p
     where exists (select 1
                     from apprentissage a
                    where a.NumPays_a = p.NumPays)
        or exists (select 1
                     from stages s
                    where s.NumPays_s = p.NumPays)
        or exists (select 1
                     from poste po
                    where po.NumPays_p = p.NumPays)

  4. #4
    Candidat au Club
    Femme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2011
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2011
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par skuatamad Voir le message
    Avec OR EXISTS :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    select NumPays, Pays
      from pays p
     where exists (select 1
                     from apprentissage a
                    where a.NumPays_a = p.NumPays)
        or exists (select 1
                     from stages s
                    where s.NumPays_s = p.NumPays)
        or exists (select 1
                     from poste po
                    where po.NumPays_p = p.NumPays)
    Merci bcp skuatamad,

    Effectivement ce code fonctionne sur ma base de tests en local (PhpMyAdmin 3.4.3.2 et MySQL 5.5.15).
    Par contre impossible de le faire s'exécuter sur la base de production sur serveur (PhpMyAdmin 2.5.4 et MySQL 4.0.18). Systématiquement il me dit que la syntaxe est incorrecte et si je le fais exécuter dans un script PHP j'ai la chose suivante: "supplied argument is not a valid MySQL result resource".

  5. #5
    Membre émérite Avatar de lola06
    Femme Profil pro
    Consultante en Business Intelligence
    Inscrit en
    Avril 2007
    Messages
    1 316
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 37
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultante en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 316
    Points : 2 520
    Points
    2 520
    Par défaut
    Le [NOT] EXIST n'est pas supporté par MySQL (cf. tuto bien pratique).

    Normalement cette requête devrait renvoyer le bon résultat :

    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 NumPays, Pays
    FROM pays py
    JOIN stages s
    ON s.NumPays_s = py.NumPays
    UNION
    SELECT NumPays, Pays
    FROM pays py
    JOIN poste p
    ON p.NumPays_p = py.NumPays
    UNION
    SELECT NumPays, Pays
    FROM apprentissage a
    JOIN stages s
    ON a.NumPays_a = py.NumPays

  6. #6
    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'est pas mieux avec un in ?

  7. #7
    Membre émérite Avatar de lola06
    Femme Profil pro
    Consultante en Business Intelligence
    Inscrit en
    Avril 2007
    Messages
    1 316
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 37
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultante en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 316
    Points : 2 520
    Points
    2 520
    Par défaut
    Citation Envoyé par punkoff Voir le message
    c'est pas mieux avec un in ?
    Ben selon le même tuto le IN "existe mais syntaxe hors norme".
    Or je suis bête et disciplinée et j'essaye de trouver une autre solution.

  8. #8
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 950
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par lola06 Voir le message
    Le [NOT] EXIST n'est pas supporté par MySQL (cf. tuto bien pratique).
    Je ne sais pas de quand date le tableau mais il n'est manifestement pas à jour.
    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
    34
    35
    36
    37
    38
    mysql> create table t1 (c int);
    Query OK, 0 rows affected (0.09 sec)
     
    mysql> insert into t1 values (1),(2),(3),(4),(5),(6),(7),(8),(9);
    Query OK, 9 rows affected (0.05 sec)
    Records: 9  Duplicates: 0  Warnings: 0
     
    mysql> create table t2 (c2 int);
    Query OK, 0 rows affected (0.06 sec)
     
    mysql> insert into t2 values (1),(2),(3),(9);
    Query OK, 4 rows affected (0.03 sec)
    Records: 4  Duplicates: 0  Warnings: 0
     
    mysql> select c
        ->   from t1
        ->  where exists (select 1
        ->                  from t2
        ->                 where t2.c2 = t1.c);
    +------+
    | c    |
    +------+
    |    1 |
    |    2 |
    |    3 |
    |    9 |
    +------+
    4 rows in set (0.05 sec)
     
    mysql> select version();
    +------------+
    | version()  |
    +------------+
    | 5.5.16-log |
    +------------+
    1 row in set (0.02 sec)
     
    mysql>
    EXISTS a peut être été implémenté avec mysql5.

  9. #9
    Membre émérite Avatar de lola06
    Femme Profil pro
    Consultante en Business Intelligence
    Inscrit en
    Avril 2007
    Messages
    1 316
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 37
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultante en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 316
    Points : 2 520
    Points
    2 520
    Par défaut
    Citation Envoyé par skuatamad Voir le message
    Je ne sais pas de quand date le tableau mais il n'est manifestement pas à jour.
    Merci pour l'info...
    maintenant ma référence principale n'est plus

    Du coup tu en sais plus pour le IN ??

  10. #10
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 950
    Points : 5 849
    Points
    5 849
    Par défaut
    Pour le IN il faut aussi faire une UNION mais on attaque 1 seule fois la table pays et on peut faire du UNION ALL, c'est donc probablement plus performant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT NumPays, Pays
      FROM pays
     where NumPays in (select NumPays_s from stages
                        union all
                       select NumPays_p from poste
                        union all
                       select NumPays_a from apprentissage)

  11. #11
    Candidat au Club
    Femme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2011
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2011
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    Effectivement cette solution doit fonctionner à partir de MySQL 5 car elle me donne le bon résultat en local mais une erreur sur le serveur:

    Citation Envoyé par skuatamad Voir le message
    Pour le IN il faut aussi faire une UNION mais on attaque 1 seule fois la table pays et on peut faire du UNION ALL, c'est donc probablement plus performant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT NumPays, Pays
      FROM pays
     where NumPays in (select NumPays_s from stages
                        union all
                       select NumPays_p from poste
                        union all
                       select NumPays_a from apprentissage)
    Par contre, cette réponse là fonctionne sur les deux!

    Citation Envoyé par lola06 Voir le message
    Le [NOT] EXIST n'est pas supporté par MySQL (cf. tuto bien pratique).

    Normalement cette requête devrait renvoyer le bon résultat :

    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 NumPays, Pays
    FROM pays py
    JOIN stages s
    ON s.NumPays_s = py.NumPays
    UNION
    SELECT NumPays, Pays
    FROM pays py
    JOIN poste p
    ON p.NumPays_p = py.NumPays
    UNION
    SELECT NumPays, Pays
    FROM apprentissage a
    JOIN stages s
    ON a.NumPays_a = py.NumPays
    Donc merci beaucoup skuatamad et lola06 d'avoir résolu mon problème!!
    A bientôt!

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

Discussions similaires

  1. Requête SQL entre deux tables
    Par DeWaRs dans le forum Langage SQL
    Réponses: 7
    Dernier message: 05/11/2012, 14h31
  2. Requête sql entre deux tables
    Par jojo86 dans le forum Bases de données
    Réponses: 3
    Dernier message: 15/02/2008, 19h19
  3. problème de requête SQL sur 3 tables pour un while
    Par carmen256 dans le forum Requêtes
    Réponses: 3
    Dernier message: 13/04/2006, 16h55
  4. [SQLserver2000][SQLServer CE] problème de requête SQL
    Par JBernn dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 27/01/2005, 09h29
  5. Problème de requète SQL dans un Requery
    Par Keraccess dans le forum Requêtes et SQL.
    Réponses: 7
    Dernier message: 22/10/2004, 14h58

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