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 :

MySQL : SELECT multitable avec problème de AND


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Inscrit en
    Février 2007
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 3
    Par défaut MySQL : SELECT multitable avec problème de AND
    Bonjour à tous,

    Je me prends la tête depuis ce matin avec cette sal#!* de requête SQL.
    Alors voilà, j'ai une base MySQL qui contient 3 tables avec leurs champs :

    1) formateurs :
    - id
    - nom
    - prenom

    2) matieres
    - id
    - intitile

    3) liste_competences_formateurs
    - id
    - formateurs_id
    - matieres_id


    Un exemple de valeur que l'on trouve dans ces tables :

    formateurs :
    | id | nom | prenom |
    -------------------------
    | 1 | Toto | titi |
    | 5 | Lui | Albert |


    matieres :
    | id | intitules |
    ---------------------
    | 1 | Français |
    | 2 | Anglais |


    liste_competences_formateurs :
    | id | formateurs_id | matieres_id |
    ----------------------------------------
    | 14 | 5 | 2 |
    | 19 | 5 | 1 |
    | 20 | 1 | 1 |


    Enfin, je cherche à obtenir l'id, le nom et le prénom des formateurs qui ont
    comme compétences le Français ET l'Anglais et qui ont dans leurs noms OU prénom la lettre "A" par exemple.

    J'ai bien tenté de faire quelque chose dans ce style :

    SELECT DISTINCT(liste_competences_formateurs.formateurs_id), formateurs.*
    FROM liste_competences_formateurs, formateurs

    WHERE
    (formateurs.nom LIKE '%A%' OR formateurs.prenom LIKE '%A%')
    AND
    (liste_competences_formateurs.matieres_id = 1
    AND
    liste_competences_formateurs.matieres_id = 2)

    AND
    liste_competences_formateurs.formateurs_id = formateurs.id
    ;

    Mais ça marche à moitié, c'est à dire que cette requête ne fonctionne plus
    s'il y a plus d'une recherche de numéro de matière. Je pense comprendre
    pourquoi ça ne marche pas, le numéro de la matière ne peut être à la fois 1
    et 2, mais je ne suis pas assez calé en SQL pour trouver une parade.
    Auriez-vous une solution à me proposer.

    Merci d'avance,
    Yan

  2. #2
    Membre Expert

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Par défaut
    Quelle est votre version de MySQL ?

  3. #3
    Futur Membre du Club
    Inscrit en
    Février 2007
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 3
    Par défaut
    Bonjour,

    Merci pour votre message,

    Il s'agit de la version 5 de MySQL

    Merci encore,
    Yan

  4. #4
    Futur Membre du Club
    Inscrit en
    Février 2007
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 3
    Par défaut
    Re, c'est résolu, voici la soluce :

    SELECT formateurs_id
    FROM
    liste_competences_formateurs

    INNER JOIN formateurs ON liste_competences_formateurs.formateurs_id = formateurs.id

    WHERE (formateurs.nom LIKE '%a%' OR formateurs.prenom LIKE '%a%')

    AND

    matieres_id in (1,2)
    GROUP BY formateurs_id
    HAVING COUNT(formateurs_id) = 2
    ;

    A+
    Yan

  5. #5
    Membre Expert

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Par défaut
    Parfait, donc vous pouvez effectuer des sous-requêtes.
    Voici une solution testée sous Oracle :
    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
     
    10g SOC5> create table formateurs(id_f varchar2(2), nom varchar2(25), prenom varchar2(25));
     
    Table créée.
     
    10g SOC5> insert into formateurs values ('1', 'Toto', 'titi');
     
    1 ligne créée.
     
    10g SOC5> insert into formateurs values ('5', 'Lui', 'Albert');
     
    1 ligne créée.
     
    10g SOC5> create table matieres (id_m varchar2(2), intitules varchar2(25));
     
    Table créée.
     
    10g SOC5> insert into matieres values ('1', 'Français');
     
    1 ligne créée.
     
    10g SOC5> insert into matieres values ('2', 'Anglais');
     
    1 ligne créée.
     
    10g SOC5> create table liste_competences_formateurs (id_c varchar2(2), id_f varchar2(2), id_m varcha
    r2(2));
     
    Table créée.
     
    10g SOC5> insert into liste_competences_formateurs values ('14', '5', '2');
     
    1 ligne créée.
     
    10g SOC5> insert into liste_competences_formateurs values ('19', '5', '1');
     
    1 ligne créée.
     
    10g SOC5> insert into liste_competences_formateurs values ('20', '1', '1');
     
    1 ligne créée.
     
    10g SOC5> SELECT F.ID_F, F.NOM, F.PRENOM
      2  FROM FORMATEURS F
      3  WHERE EXISTS ( SELECT *
      4                 FROM   LISTE_COMPETENCES_FORMATEURS LCF, MATIERES M
      5                 WHERE  LCF.ID_F = F.ID_F
      6                 AND    LCF.ID_M = M.ID_M
      7                 AND    M.INTITULES = 'Français' )
      8  AND EXISTS   ( SELECT *
      9                 FROM   LISTE_COMPETENCES_FORMATEURS LCF, MATIERES M
     10                 WHERE  LCF.ID_F = F.ID_F
     11                 AND    LCF.ID_M = M.ID_M
     12                 AND    M.INTITULES = 'Anglais' )
     13  AND (   INSTR(NOM,    'A') <> 0
     14       OR INSTR(PRENOM, 'A') <> 0 );
     
    ID NOM                       PRENOM
    -- ------------------------- -------------------------
    5  Lui                       Albert
     
    1 ligne sélectionnée.
    Vous comprenez la logique ?

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

Discussions similaires

  1. [MySQL] Mysql selection liées avec (les sessions)
    Par glodybiss4 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 22/08/2012, 09h49
  2. Select multitables avec égalité sur 2 lignes
    Par Greco dans le forum Requêtes
    Réponses: 8
    Dernier message: 07/02/2009, 15h30
  3. Comment eviter Lock MySQL 5.0 avec un SELECT
    Par kilicool dans le forum Requêtes
    Réponses: 4
    Dernier message: 04/10/2007, 14h15
  4. Réponses: 4
    Dernier message: 24/11/2006, 16h57
  5. [Mysql 3.23.58] Problème avec insert
    Par trihanhcie dans le forum Requêtes
    Réponses: 2
    Dernier message: 11/08/2006, 11h04

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