===== SQL ===== ==== code intersection de deux arbre et aucun doublon: ==== /*select schema*/ use genealogy; /*recursive cte1*/ with recursive anc1 as(select *,0000001 st from t_person where id=1673247 UNION select p.*,((2*anc1.st)+(p.Sexe='F')) st from t_person p join anc1 on anc1.idf=p.id or anc1.idm=p.id), /*recursive cte2*/ anc2 as(select *,0000001 st from t_person where id=1673246 UNION select p.*,((2*anc2.st)+(p.Sexe='F')) st from t_person p join anc2 on anc2.idf=p.id or anc2.idm=p.id), /*find intersection between cte1 and cte2*/ ancm as(select anc1.*,least(anc1.st,anc2.st) lst from anc1 join anc2 using(id)), /*colapse double entries with smallest stradonits*/ ancf as(select id,idm,idf,Prenom,Nom,Sexe,min(lst) mst from ancm group by id,idm,idf,Prenom,Nom,Sexe) /*acutual selection of result*/ select *,strad(mst) strad from ancf; ==== code recursion et location ==== with recursive anc1 as(select * from t_person where id=1673247 UNION select p.* from t_person p join anc1 on anc1.idf=p.id or anc1.idm=p.id), anc2 as(select * from t_person where id=1673246 UNION select p.* from t_person p join anc2 on anc2.idf=p.id or anc2.idm=p.id) select max(py) py,max(pr) pr,lat,lon,group_concat(u.id,': ',u.Nom,' | ',u.Prenom SEPARATOR '\n') p from (select anc1.* from anc1 join anc2 using(id)) as u join plr using(id) join places on n_lid=lid or d_lid=lid where lat is not null group by lat,lon ==== code recurtion et recherche de parent simple inconue ==== with recursive anc as(select * from t_person where id=9999999 UNION select p.* from t_person p join anc on p.id=anc.idm or p.id=anc.idf) select * from anc where idm is NULL xor idf is NULL