Bonsoir,

Je ronge un os...
Je réalise actuellement un module sur un logiciel existant, je ne peux donc modifier la structure de la base.
La table à laquelle j'accède à la structure suivante :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
ATTRIBUTS(#id, id_article, nom_attribut, valeur_attribut)
Chaque enregistrement correspond à un attribut et sa valeur pour un article donné.
Un article a plusieurs attributs.
Mon but est de proposer à l'utilisateur des listes de valeurs à sélectionner pour chaque attributs.
Les listes doivent être dynamiques. Si l'utilisateur a choisi une valeur dans une première liste,
la seconde liste (second attribut) ne doit proposer uniquement les valeurs pour lesquelles la combinaison existe.

Exemple dans la table :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
 
id - id_article - nom_attribut - valeur_attribut
--------------------------------------------------------------------
1     23             attr1               1 
2     23             attr2               12
3     36             attr1               1
4     36             attr2               6
5     58             attr1               1
6     58             attr2               8
7     79             attr1               2
8     79             attr2               4
Exemple de liste :

Si je choisi la valeur 1 pour l'attribut attr1, dans la seconde liste je dois avoir :

Pas compliqué vous me direz :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
 
SELECT * from table WHERE id_article IN 
(SELECT id_article FROM table WHERE nom_attribut='attr1' and valeur_attribut = 1);
Voir une auto-jointure... je ne sais pas si c'est une bonne solution je ne suis pas très calé dans le domaine.

Mais le gros soucis c'est que mon exemple se base sur 2 attributs différents, or en réalité il peut y en avoir bien plus. Et je ne sais pas à l'avance combien. Et je ne suis pas sur que ça soit très efficace d'imbriquer et d'imbriquer encore des requêtes... Surtout qu'elle sera soumise à bonne charge.

Existe-t'il un moyen plus propre d'obtenir ce résultat sans modifier la structure de la table ? Je sèche ...

Merci d'avance.