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?
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" :yaisse:
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 :roi:
Code:
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
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.
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"
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. :roll:
Parfois il est simple de réaliser des choses dont la formulation est complexe et inversement :wink:
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:
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( * ) |
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!
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. :roll:
Parfois il est simple de réaliser des choses dont la formulation est complexe et inversement :wink:
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:
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 :oops:
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:
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( * ) |
Re: Table de relation et sélection via jointure
Citation:
Envoyé par papounet
Code:
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. :wink: