Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Requete SQL svp

19 views
Skip to first unread message

Stéphane Santon

unread,
Jun 13, 2012, 6:20:22 PM6/13/12
to
Bonjour,

Sous MySQL, j'ai :
- une table typeoptions {
id_typeoption : bigint,
titre: varchar
}
- une table options {
id_option: bigint,
objet: enum( 'article', 'rubrique', 'etablissement'),
id_objet: bigint,
active: enum ('non', 'oui', 'rubrique')
}

Une option peut avoir les valeurs 'non', 'oui', ou 'rubrique' qui
signifie qu'elle hᅵrite de l'ᅵtat de l'option affectᅵe ᅵ sa rubrique
(on prendra 5 ici par exemple), que l'on retrouve dans la mᅵme table :
- dans l'enregistrement (objet = 'rubrique', id_objet = sa_rubrique)
ou ᅵ dᅵfaut
- dans l'enregistrement (objet = 'rubrique', id_objet = 0)

Je cherche la requᅵtre SQL correspondante qui permet d'extraire les
options dont active est ᅵ 'oui', ou, ᅵ 'rubrique' et que le active de
rubrique est ᅵ 'oui' (hᅵritage)...

Dans le genre...

SELECT o.id_option, o.active, h.active
FROM options AS o
JOIN options as h
ON
(o.active = 'oui') OR
( (o.active = 'rubrique') AND (h.objet = 'rubrique) AND (h.active =
'oui') )

Merci !

--
Stᅵphane

Jeune Chambre Economique de Saintes *** http://www.jce-saintes.org
Agitateurs d'idᅵes... accᅵlᅵrateurs de talents !

BTS Electrotechnique *** http://enselec.santonum.eu


pif34

unread,
Jun 14, 2012, 2:17:07 AM6/14/12
to
Le 14/06/2012 00:20, Stᅵphane Santon a ᅵcrit :
pour ce que j'ai compris, ta requᅵte est pas male, il manque peut ᅵtre
une jointure ouverte correctement ᅵcrite:
from .....
left outer join .... on o.x = h.y
where (o.active = 'oui') or (..... )

sinon, tu peux faire la meme chose avec un 'in' et une sous requᅵte,
mais en gᅵnᅵral c'est plus couteux en terme de perfs...

>
> Merci !
>

Stéphane Santon

unread,
Jun 15, 2012, 3:51:38 PM6/15/12
to
Bonjour,

J'ai pas mal ramé, mais à force d'essais pas à pas...

Voici ma table :
id_option; objet; id_objet; id_typeoption; active

1 etabliss 0 2 rubrique
2 etabliss 0 3 rubrique
3 etabliss 0 4 rubrique
4 etabliss 0 5 non
5 rubrique 0 2 oui
6 rubrique 0 3 oui
7 rubrique 0 4 oui
8 rubrique 0 5 non
9 etabliss 0 6 rubrique
10 rubrique 0 6 oui
11 etabliss 106 3 rubrique
12 etabliss 106 6 oui

Je cherche un id_option pour lequel :
- objet est défini, et
- id_objet est défini, et
- id_typeoption est défini, et

- active vaut 'oui'
OU
- (active vaut 'rubrique'
ET il existe un enregistrement "d'héritage" pour lequel
objet vaut 'rubrique' et
id_objet vaut 0 et
active vaut 'oui'

J'ai un résultat correct avec :

SELECT
o.id_option,
o.objet, o.id_objet, o.active,
h.objet, h.id_objet, h.active
FROM
mobidev_options AS o
LEFT OUTER JOIN
mobidev_options AS h
ON (h.objet = o.active) AND (h.id_objet = 0) and (h.id_typeoption = 3)
WHERE (o.objet = 'etablissement') AND (o.id_objet = 106) and
(o.id_typeoption = 3)

Est-ce correct, est-ce optimisable en perfs ??

Merci

--
Stéphane

Jeune Chambre Economique de Saintes *** http://www.jce-saintes.org
Agitateurs d'idées... accélérateurs de talents !

pif34

unread,
Jun 15, 2012, 4:25:31 PM6/15/12
to
je captue pas pourquoi y'a des valeurs en dur genre id_type_option = 3 ?
ta jointure devrait plutot etre du genre:
t1 left outer join t2 on t1.id_de_ma_fk = t2.id_de_ma_pk and t2.objet
= 'rubrique' and t2.active = 'oui' ...

ta requête reflete pas ton contenu..


par ailleurs, si tu veux un coup de main, faut qu'à un moment donné on
comprenne le schéma: quelle est l'autojointure, quelles sont les PK et
les FK....

> Merci
>

Stéphane Santon

unread,
Jun 15, 2012, 4:43:10 PM6/15/12
to
pif34 a écrit :
> je captue pas pourquoi y'a des valeurs en dur genre id_type_option = 3 ?
> ta jointure devrait plutot etre du genre:
> t1 left outer join t2 on t1.id_de_ma_fk = t2.id_de_ma_pk and t2.objet =
> 'rubrique' and t2.active = 'oui' ...
>
> ta requête reflete pas ton contenu..
>
>
> par ailleurs, si tu veux un coup de main, faut qu'à un moment donné on
> comprenne le schéma: quelle est l'autojointure, quelles sont les PK et les
> FK....

Parce que les valeurs en dur ne sont pas le coeur du problème à mon
avis, j'ai donc simplifié par une constante.
PK / FK je ne comprends pas....

Voici l'essence :

J'ai des objets de type rubrique, articles, etabliss, ... chacun
identifié par un id_objet.

Pour un objet identifié donné (ici objet = 'etabliss', et id_objet =
106), je cherche à savoir s'il existe une option identifiée attachée
dans la table options décrite.

L'option peut être directe : active = 'oui' ou 'non'
ou indirecte, héritée du type d'objet : active = 'rubrique'.
Si l'option est héritée, je veux récupérer la vraie valeur de l'option
dans la table.

Exemples :

Pour l'établissement 106, le typeoption 6 est active, on le sait
directement par l'id_option récupéré /12/

Pour l'établissement 106, le typeoption /3/ est définie par l'option
des rubriques, on le sait par l'id_option récupéré /11/.
Il faut alors joindre l'enregistrement de la même table pour lequel
objet = 'rubrique' et id_typeoption = 3 (et id_objet = 0).
On trouve alors 'oui' par l'id_option '6'

On récupère alors un unique enregistrement :
id_option objet id_objet active objet id_objet active
11 etablissement 106 rubrique rubrique 0 oui

pif34

unread,
Jun 16, 2012, 8:05:42 AM6/16/12
to
Le 15/06/2012 22:43, Stéphane Santon a écrit :

> PK / FK je ne comprends pas....

clé primaire, clé étrangère
0 new messages