[MySQL] Jointure sur une meme table

Jointure sur une meme table [MySQL] - SQL/NoSQL - Programmation

Marsh Posté le 14-09-2011 à 15:56:55    

Bonjour,
 
Je vais essayer de vous expliquer mon problème clairement.
Disons que j'ai une table avec la structure suivante :
 

Code :
  1. CREATE TABLE FAMILLE (
  2.   id SERIAL,
  3.   nom varchar(100),
  4.   prenom varchar(100),
  5.   parent int,
  6.   PRIMARY KEY (id)
  7. );


 
J'ai donc un principe parent-enfant.
 
Si je veux remonter le parent d'un enfant ma requête serait :

Code :
  1. SELECT *
  2. FROM FAMILLE AS F1
  3. INNER JOIN FAMILLE AS F2 ON F1.parent = F2.id


 
En revanche si je veux remonter tous les parents, grand parent, arrière grand parent etc... jusqu'à ce que l'id parent soit NULL, comment puis-je faire ?
 
Je sais que si je veux remonter sur x générations de plus je rajoute x INNER JOIN FAMILLE et ainsi de suite. Sauf que là je ne sais pas combien de génération il peut y avoir.
Je veux donc que ca s'arrete quand le champ parent égale NULL.
 
Si vous pouvez m'aider ?
 
Merci d'avance

Reply

Marsh Posté le 14-09-2011 à 15:56:55   

Reply

Marsh Posté le 14-09-2011 à 16:22:46    

Ca n'existe pas sous mysql, la seule solution serait de boucler dans le langage appelant ou de modifier la structure de la table pour obtenir quelque chose d'exploitable plus facilement.
A noter : c'est une des features envisagées pour plus tard, un équivalent du connect by prior d'oracle : http://dev.mysql.com/doc/refman/5. [...] uture.html


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 14-09-2011 à 16:56:50    

Il y a des moyen de passer a coté du probleme en utilisant une autre colonne, mais les different trucs ont un impact sur la lecture ou sur la mise a jour (en fonctione de ce qu'on choisit).
 
C'est jamais facil de faire du hierarchic dans une db relationelle :)
 
Ce lien a déjà pas mal d'exemples avec des super explications: http://mikehillyer.com/articles/ma [...] -in-mysql/

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed