Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Requete SQL svp

5 réponses
Avatar
Stéphane Santon
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

5 réponses

Avatar
pif34
Le 14/06/2012 00:20, Stéphane Santon a écrit :
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') )



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 !

Avatar
Stéphane Santon
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 !

BTS Electrotechnique *** http://enselec.santonum.eu
Avatar
pif34
Le 15/06/2012 21:51, Stéphane Santon a écrit :
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 ??




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

Avatar
Stéphane Santon
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



--
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
Avatar
pif34
Le 15/06/2012 22:43, Stéphane Santon a écrit :

PK / FK je ne comprends pas....



clé primaire, clé étrangère