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 :

Table de relation et sélection via jointure


Sujet :

Langage SQL

  1. #1
    Nouveau membre du Club
    Inscrit en
    Octobre 2004
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 33
    Points : 30
    Points
    30
    Par défaut Table de relation et sélection via jointure
    Bonjour,

    J'ai une base dans laquelle je stocke des expressions de la langue française ainsi que leurs mot correspondants.

    Un mot pouvant appartenir à plusieurs phrases, et une phrase contenant plusieurs mot, une table de jointure est crée.

    Mon schéma ressemble à celà :
    Table Expression : id_expression, expression
    Table Mot : id_mot, mot, chps_lexical (chaine de caractère indiquant champ lexical du mot)
    Table relation ExpressionMot : id_expression, id_mot

    Je cherche à sélectionner les expressions dont TOUS les mots appartiennent au champ lexical de la mort par exemple.

    Ma requête est la suivante :
    SELECT DISTINCT E.expression
    FROM expression E, expressionmot EM, mot M
    WHERE E.id_expression = EM.id_expression
    AND EM.id_mot= M.id_mot
    AND M.chps_lexical= 'la mort'

    Or celà ne marche pas car ça me renvoie toutes les expressions dont l'UN des mot seulements appartient au champ de la mort.

    Comment procéder pour forcer SQL à me renvoyer que les expressions dont tout les mot correspondent à ma condition?

  2. #2
    Membre habitué Avatar de nantais
    Inscrit en
    Juillet 2004
    Messages
    158
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 158
    Points : 192
    Points
    192
    Par défaut
    Sous quel SGBD es tu car il est important de savoir s'il est possible de rechercher avec des requêtes imbriquées...

  3. #3
    Membre du Club
    Inscrit en
    Avril 2004
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 54
    Points : 65
    Points
    65
    Par défaut Re: Table de relation et sélection via jointure
    Ta requete fait exactement ce que tu lui demande de faire

    "Donne mois toutes les expressions dont au moins un des mots est dans le champ lexical de la mort"

    Ceci est un premier pas qui va te permettre d'arriver à ce que tu cherche

    => Tu as déja réduit le champ des expressions candidates

    Avec une petite sur-couche complémentaire

    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
     
    select
               A.expression , a.NK_OK , count(*)
    from
         ( SELECT
                        E.ID_expression , E.expression , count( * ) NB_OK
            FROM 
                        expression E, 
                        expressionmot EM, 
                        mot M
            WHERE 
                        E.id_expression = EM.id_expression and
                        EM.id_mot         = M.id_mot     and
                        M.chps_lexical    = 'la mort'
          ) as      A 
    inner join
            expressionmot B
    on
             B.id_expression = A.id_expression
    group by
             a.expression , a.NB_OK
    having
                  count(*) = A.NB_OK
    Dans quel champ lexical unique peux tu mettre le mot "VOL" :

    Il me semble que le modele necessite deux tables supplémentaires pour etre normalisée

    T1 Mot / ID_Mot
    T2 Expression / ID_Expression
    T3 Champ Lexical / ID_Champ_Lexical => Impératif
    T4 Lien mot * champ lexical / ID_Mot + ID_Champ_Lexical=> Impératif
    T5 Mot de l'expression / ID_Expression + ID_Mot

  4. #4
    Nouveau membre du Club
    Inscrit en
    Octobre 2004
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 33
    Points : 30
    Points
    30
    Par défaut
    Citation Envoyé par nantais
    Sous quel SGBD es tu car il est important de savoir s'il est possible de rechercher avec des requêtes imbriquées...
    Oui pardon, MySQL 4.0 donc les requêtes imbriquées sont limitées...

  5. #5
    Nouveau membre du Club
    Inscrit en
    Octobre 2004
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 33
    Points : 30
    Points
    30
    Par défaut Re: Table de relation et sélection via jointure
    Citation Envoyé par papounet

    Dans quel champ lexical unique peux tu mettre le mot "VOL" :
    Au niveau de la conception, c'set volontairement simplifié.

    On a décidé de ne pas créer de tables pour le champ lexical, celui-ci est présent directement dans un champ de la table mot. Le champs lexical peut avoir la valeur null donc seuls quelques mots appartiennent à un champ lexical, donc le mot "vol" peut très bien n'appartenir à aucun champ lexical./

    Je vais jeter un coup d'oeil sur ta solution et essayer de voir une adaptation pour MySQL.

  6. #6
    Membre du Club
    Inscrit en
    Avril 2004
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 54
    Points : 65
    Points
    65
    Par défaut Re: Table de relation et sélection via jointure
    Citation Envoyé par 73672
    Citation Envoyé par papounet

    Dans quel champ lexical unique peux tu mettre le mot "VOL" :
    Au niveau de la conception, c'set volontairement simplifié.
    => "Vol de nuit" est elle une expression qui fait il parti du champ lexical
    "Thriller policier" ou du champ lexical "roman d'aventure"

  7. #7
    Membre du Club
    Inscrit en
    Avril 2004
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 54
    Points : 65
    Points
    65
    Par défaut Re: Table de relation et sélection via jointure
    Citation Envoyé par 73672
    Les relations sont là mais le manque de savoir-faire me bloque dans la formulation de la requête que je trouve d'ailleurs compliquée pour une action à produire aussi simple.
    Parfois il est simple de réaliser des choses dont la formulation est complexe et inversement

    La deuxieme requete n'est pas compliqué, la seule "apparence" de complexité est la formulation permetant de comptabiliser les éléments non NULL

    Elle pourait éventuellement etre écrite de cette façon, mais elle renverait probablement un tas de WARNING

    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
    SELECT
                 A.expression , 
                 count( C.id_mot ) ,
                 count( * ) 
    FROM 
                 expression    A
              inner join
                 expressionmot B
              on
                 b.id_expression = a.id_expression
              Left join  
                 mot  C
              on
                 C.id_mot         = B.id_mot and 
                 C.chps_lexical    = 'la mort'
    group by
             A.expression 
    having
                count( C.id_mot ) = count( * )

  8. #8
    Nouveau membre du Club
    Inscrit en
    Octobre 2004
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 33
    Points : 30
    Points
    30
    Par défaut Re: Table de relation et sélection via jointure
    Citation Envoyé par papounet
    Citation Envoyé par 73672
    Citation Envoyé par papounet

    Dans quel champ lexical unique peux tu mettre le mot "VOL" :
    Au niveau de la conception, c'set volontairement simplifié.
    => "Vol de nuit" est elle une expression qui fait il parti du champ lexical
    "Thriller policier" ou du champ lexical "roman d'aventure"
    Dans le modèle, un mot ne peut appartenir qu'à un champ lexical(modèle simplifié par rapport à la réalité.)

    Le champs lexical d'une expression est quand à lui dépendant du champs lexical des mots qui la compose et peut donc appartenir à plusieurs chps lexicaux.(là aussi simplification de la réalité qui est bien complexe à modéliser si on rentre dans des notions de sémantique.)

    Mais bon mon problème n'est pas vraiment la conception mais la requête. Je vais voir par rapport à l'exemple que tu m'a mis pour MySQL. Je vois que j'ai encore du boulot pour apprendre à manier correctement SQL

    C'est clair qu'il y a rapidement des limitations avec MySQL en dehors des requêtes classiques.

    Mais la version 5.0 qui est déjà sortie je crois prends en charge de nouvelles fonctionnalités comme les requêtes imbriquées!

  9. #9
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    Mais bon mon problème n'est pas vraiment la conception mais la requête.
    oui mais les problémes de requête sont souvent dû à un défaut de modélisation

  10. #10
    Nouveau membre du Club
    Inscrit en
    Octobre 2004
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 33
    Points : 30
    Points
    30
    Par défaut
    Citation Envoyé par orafrance
    Mais bon mon problème n'est pas vraiment la conception mais la requête.
    oui mais les problémes de requête sont souvent dû à un défaut de modélisation
    Oui mais pas vraiment dans mon cas

    Les relations sont là mais le manque de savoir-faire me bloque dans la formulation de la requête que je trouve d'ailleurs compliquée pour une action à produire aussi simple.

  11. #11
    Membre du Club
    Inscrit en
    Avril 2004
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 54
    Points : 65
    Points
    65
    Par défaut Re: Table de relation et sélection via jointure
    Citation Envoyé par 73672
    Les relations sont là mais le manque de savoir-faire me bloque dans la formulation de la requête que je trouve d'ailleurs compliquée pour une action à produire aussi simple.
    Parfois il est simple de réaliser des choses dont la formulation est complexe et inversement

    La deuxieme requete n'est pas compliqué, la seule "apparence" de complexité est la formulation permetant de comptabiliser les éléments non NULL

    Elle pourait éventuellement etre écrite de cette façon, mais elle renverait probablement un tas de WARNING

    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
    SELECT
                 A.expression , 
                 count( C.id_mot ) ,
                 count( * ) 
    FROM 
                 expression    A
              inner join
                 expressionmot B
              on
                 b.id_expression = a.id_expression
              Left join  
                 mot  C
              on
                 C.id_mot         = B.id_mot and 
                 C.chps_lexical    = 'la mort'
    group by
             A.expression 
    having
                count( C.id_mot ) = count( * )
    Bon j'ai confondu éditer et citer

    La formulation initiale était celle-ci, le reste de mon blabla a disparu corps et bien

    Defauts :
    - Implique l'accés a tous les enregistrement du modele => Cher
    Nécessite que MYSQL appréci :
    - Les jointures externes
    - Les CASE ( en + dans une expression arithmetique )
    - Soit capable de gérer les NULL

    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
    SELECT
                 A.expression , 
                 sum( case when C.id_mot is NULL then 0 else 1 end ) ,
                 count( * ) 
    FROM 
                 expression    A
              inner join
                 expressionmot B
              on
                 b.id_expression = a.id_expression
              Left join  
                 mot  C
              on
                 C.id_mot         = B.id_mot and 
                 C.chps_lexical    = 'la mort'
    group by
             A.expression 
    having
                sum( case when C.id_mot is NULL then 0 else 1 end ) = count( * )

  12. #12
    Nouveau membre du Club
    Inscrit en
    Octobre 2004
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 33
    Points : 30
    Points
    30
    Par défaut Re: Table de relation et sélection via jointure
    Citation Envoyé par papounet

    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
    SELECT
                 A.expression , 
                 count( C.id_mot ) ,
                 count( * ) 
    FROM 
                 expression    A
              inner join
                 expressionmot B
              on
                 b.id_expression = a.id_expression
              Left join  
                 mot  C
              on
                 C.id_mot         = B.id_mot and 
                 C.chps_lexical    = 'la mort'
    group by
             A.expression 
    having
                count( C.id_mot ) = count( * )
    Je te remercie ça passe niquel sous MySQL.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 20/04/2015, 12h15
  2. Jointure sur une table de relation
    Par orion99 dans le forum Langage SQL
    Réponses: 6
    Dernier message: 04/03/2014, 12h18
  3. Créer une relation entre deux tables en liste de choix via SQL
    Par myrddin99 dans le forum Requêtes et SQL.
    Réponses: 7
    Dernier message: 07/05/2012, 23h44
  4. Jointure avec une table d'historique et sélection du plus récent
    Par thor76160 dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 13/07/2011, 12h36
  5. Requete via jointure tables N-N
    Par Shabata dans le forum Langage SQL
    Réponses: 5
    Dernier message: 03/04/2008, 15h53

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