diff --git a/ecrire/public/criteres.php b/ecrire/public/criteres.php
index b9b27d7d05f9c7c28309df79f772ec273eb2d510..14d816f35960e844834949a78e62879eef38c705 100644
--- a/ecrire/public/criteres.php
+++ b/ecrire/public/criteres.php
@@ -703,10 +703,12 @@ function calculer_jointure(&$boucle, $depart, $arrivee, $col='', $cond=false)
   return $n;
 }
 
-function calculer_chaine_jointures(&$boucle, $depart, $arrivee, $vu=array())
+function calculer_chaine_jointures(&$boucle, $depart, $arrivee, $vu=array(), $milieu_prec = false)
 {
 	list($dnom,$ddesc) = $depart;
 	list($anom,$adesc) = $arrivee;
+	if (!count($vu))
+		$vu[] = $dnom; // ne pas oublier la table de depart
 
 	$keys = $ddesc['key'];
 	if ($v = $adesc['key']['PRIMARY KEY']) {
@@ -727,14 +729,16 @@ function calculer_chaine_jointures(&$boucle, $depart, $arrivee, $vu=array())
 			    ($def = trouver_def_table($v, $boucle))) {
 				list($table,$join) = $def;
 				$milieu = array_intersect($ddesc['key'], trouver_cles_table($join['key']));
-				foreach ($milieu as $k)	{
-					$new[] = $v;
-					$r = calculer_chaine_jointures($boucle, array($table, $join), $arrivee, $new);
-					if ($r)	{
-						array_unshift($r, array($dnom, $def, $k));
-						return $r;
+				$new[] = $v;
+				foreach ($milieu as $k)
+					if ($k!=$milieu_prec) // ne pas repasser par la meme cle car c'est un chemin inutilement long
+					{
+						$r = calculer_chaine_jointures($boucle, array($v, $join), $arrivee, $new, $k);
+						if ($r)	{
+							array_unshift($r, array($dnom, $def, $k));
+							return $r;
+						}
 					}
-				}
 			}
 		}
 	}