Phpmyadmin sql jointure / restriction

Résolu/Fermé
necro27 Messages postés 160 Date d'inscription jeudi 28 mai 2009 Statut Membre Dernière intervention 11 février 2011 - Modifié par necro27 le 9/02/2011 à 10:30
necro27 Messages postés 160 Date d'inscription jeudi 28 mai 2009 Statut Membre Dernière intervention 11 février 2011 - 9 févr. 2011 à 13:51
Bonjour à toutes et à tous,

Bon je ne sais pas donner de termes exacts à mon problème pour le titre.

Je m'explique :

Je dispose d'une base de données où je possède 5 tables, que sont la table type matériel, matériel, famille et sous famille, et recenser qui est en fait une association entre la table materiel et ss-famille.

type_materiel(id_type, lib_type)   
famille(id_fam, lib_fam)   
ss_famille(id_fam#, id_ss_fam, lib_ss_fam)   
materiel (id_mat, id_type#)   
recenser (id_fam#, id_ss_fam#, id_mat#)


Mon souci :

Avec l'aide d'une (ou plusieurs) requêtes sql, j'essaie de répondre à la question suivante :

Existe t'il un matériel ayant pour
id_fam = 1 et id_ss_fam = 1
ET id_fam = 2 et id_ss_fam = 1
ET id_fam = 3 et id_ss_fam = 2
....etc

En gros j'essaie de faire quelque chose qui se comprendrait comme cela (ce qui est impossible je sais en sql, enfin je pense)
"where id_famille=1.id_ss_famille=1
and id_famille=2.id_ss_famille=1
and id_famille=3.id_ss_famille=2
...

En d'autres termes, je voudrai pouvoir faire un tri sur un id_ss_famille relatif à un id_famille, sachant que mon matériel peut posséder plusieurs familles...


Je ne vois vraiment pas de quelle manière je peux m'y prendre, aussi bien avec une, que plusieurs requêtes sql...

Merci à ceux qui voudrons bien m'aider. Pour information, je travaille sur un site intranet, donc où mes requêtes sont exécutées via php.

Si besoin de plus d'information, ne pas hésiter merci beaucoup d'avance.


[EDIT] : voici certains essai, qui bien sûr ne fonctionnent pas.
select distinct m.id_materiel 
from materiel as m, recenser as r, famille as f, ss_famille as ssf 
where f.id_famille=ssf.id_famille  
and m.id_materiel=r.id_materiel 
and r.id_famille=ssf.id_famille 
and r.id_ss_famille=ssf.id_ss_famille 
and m.id_materiel=1 
and ssf.id_famille in (1,2,3,4) 
and ssf.id_ss_famille in (1,2,3)


select m.id_materiel 
from materiel as m, recenser as r, famille_technique as f, ss_famille as ssf 
where f.id_famille=ssf.id_famille  
and m.id_materiel=r.id_materiel 
and r.id_famille=ssf.id_famille 
and r.id_ss_famille=ssf.id_ss_famille 
and m.id_type_materiel=1 
and ssf.id_famille = 1 
and ssf.id_ss_famille= 3 
and ssf.id_famille = 2 
and ssf.id_ss_famille= 2 
and ssf.id_famille = 3 
and ssf.id_ss_famille= 2 
and ssf.id_famille = 4 
and ssf.id_ss_famille= 1


select m.id_materiel 
from materiel as m, recenser as r 
where m.id_materiel=r.id_materiel 
and m.id_type_materiel=1 
and m.id_materiel in  ( select m.id_materiel 
       from materiel m, recenser r 
       where m.id_materiel=r.id_materiel 
       and r.id_famille = 2 
       and r.id_id_ss_famille= 2 
      )  
and m.id_materiel in  ( select m.id_materiel 
       from materiel m, recenser r 
       where m.id_materiel=r.id_materiel 
       and r.id_famille = 1 
       and r.id_id_ss_famille = 3 
      ) 


Necro27

2 réponses

necro27 Messages postés 160 Date d'inscription jeudi 28 mai 2009 Statut Membre Dernière intervention 11 février 2011 8
Modifié par necro27 le 9/02/2011 à 12:32
Bon apparemment pour mon cas il faudrait voir avec union et intersect..

Après lectures, et tests avec union, je m'aperçois que intersect serais plu approprié pour mon problème.


Seulement d'après d'autres lectures, phpmyadmin ne semble pas reconnaitre intersect...

Comment trouver quelque chose d'équivalent ?

J'ai trouvé des aides ici http://oseox.fr/sql/union-jointure.html
il est bien dit que
"L'intersection de A et de B contiendra des éléments qui sont à la fois dans A et dans B."

Donc on aura bien comme résultat un élément commun entre a et b ?

Mais cette fonction n'a l'air de fonctionner qu'avec 2 tables, il n'y a pas moyen de le faire seulement sur une seule table ?

select id_materiel 
from recenser 
where id_famille = 1 
and id_caracteristique = 3 
intersect 
select id_materiel 
where id_famille = 2 
and id_caracteristique = 2 
intersect 
select id_materiel 
where id_famille = 3 
and id_caracteristique = 2


Donc en gros je voudrai le numéro de matériel qui possède pour famille 1 la sous-famille 3, ET qui possède pour famille 2 la sous-famille 2, ET pour la famille 3 la sous-famille 2...

Merci de pouvoir m'aider...
1
necro27 Messages postés 160 Date d'inscription jeudi 28 mai 2009 Statut Membre Dernière intervention 11 février 2011 8
Modifié par necro27 le 9/02/2011 à 13:52
Réponse trouvée :)

SELECT r1.id_materiel 
FROM recenser r1 
INNER JOIN recenser r2 ON r2.id_materiel = r1.id_materiel 
WHERE r1.id_famille = 1 
    AND r1.id_ss_famille = 3 
    AND r2.id_famille = 2 
    AND r2.id_ss_famille = 2 


Tout simplement...

Bonne journée à tous !

neco27
0