diff --git a/inc-criteres.php3 b/inc-criteres.php3
index 6e47b7b898737ba8167a444928c07ad85100468a..927d50e685dc50a12da2de41de9c666e9ada58f7 100644
--- a/inc-criteres.php3
+++ b/inc-criteres.php3
@@ -356,6 +356,7 @@ function calculer_criteres ($idb, &$boucles) {
 function calculer_critere_DEFAUT($idb, &$boucles, $crit) {
 	
 	global $table_date, $tables_des_serveurs_sql;
+	global $tables_relations;
 
 	$boucle = &$boucles[$idb];
 	$type = $boucle->type_requete;
@@ -430,34 +431,31 @@ function calculer_critere_DEFAUT($idb, &$boucles, $crit) {
 
 	// reperer les champs n'appartenant pas a la table de la boucle
 
-	if ($s = calculer_critere_externe($boucle, $id_field,$col, $type))
-		$col_table = $s;
-
+	if ($ext_table =  $tables_relations[$type][$col])
+		$col_table = $ext_table . 
+		  calculer_critere_externe($boucle, $id_field, $ext_table);
 	// Cas particulier pour les raccourcis 'type_mot' et 'titre_mot'
-	else if ($type != 'mots'
+	elseif ($type != 'mots'
 			AND ($col == 'type_mot' OR $col == 'titre_mot'
 			OR $col == 'id_groupe')) {
 		if ($type == 'forums')
-		  $col_lien = "forum";
+		  $lien = "mots_forum";
 		else if ($type == 'syndication')
-		  $col_lien = "syndic";
+		  $lien = "mots_syndic";
 		else
-		  $col_lien = $type;
-		$boucle->from[] = "spip_mots_$col_lien AS lien_mot";
-		$boucle->from[] = 'spip_mots AS mots';
-		$boucle->where[] = "$id_field=lien_mot." . $primary;
-		$boucle->where[] = 'lien_mot.id_mot=mots.id_mot';
-		$boucle->group = $id_field;
-		$boucle->select[] = $id_field; # pour postgres, neuneu ici
-		$col_table = 'mots';
-
-		$boucle->lien = true;
+		  $lien = "mots_$type";
+		
+		// jointure nouvelle a chaque comparaison
+		$num_lien = calculer_critere_externe($boucle, $id_field, $lien );
+		// jointure pour lier la table principale et la nouvelle
+		$boucle->from[] = "spip_mots AS l_mots$num_lien";
+		$boucle->where[] = "$lien$num_lien.id_mot=l_mots$num_lien.id_mot";
+		$col_table = "mots$num_lien";
+
 		if ($col == 'type_mot')
 		  $col = 'type';
 		else if ($col == 'titre_mot')
 		  $col = 'titre';
-		else if ($col == 'id_groupe')
-		  $col = 'id_groupe';
 	}
 
 	// Cas particulier : selection des documents selon l'extension
@@ -557,9 +555,8 @@ function calculer_critere_DEFAUT($idb, &$boucles, $crit) {
 	// fonction SQL
 	if ($fct) $ct = "$fct($ct)";
 
-	if (($op != '=') || !calculer_critere_repete($boucle, $ct, $val[0]))
-	  {
-	    if (strtoupper($op) == 'IN') {
+	//	if (($op != '=') || !calculer_critere_repete($boucle, $ct, $val[0])) # a revoir
+	if (strtoupper($op) == 'IN') {
 	      $val = join(" .\n\"','\" . ", $val);
 	  
 	      $where = "$ct IN ('\" . $val . \"')";
@@ -581,13 +578,14 @@ function calculer_critere_DEFAUT($idb, &$boucles, $crit) {
 		    $where = "\".($champ ? \"$where\" : 1).\"";
 		  }
 	    }
-	    $boucle->where[] = $where;
-	  }
+
+	$boucle->where[] = $where;
 }
 
+// fonction provisoirement inutilisee
 // reperer des repetitions comme {id_mot=1}{id_mot=2}
 //  pour creer une clause HAVING
-
+/*
 function calculer_critere_repete(&$boucle, $col, $val)
 {
 	foreach ($boucle->where as $k => $v)  {
@@ -599,26 +597,21 @@ function calculer_critere_repete(&$boucle, $col, $val)
               }
 	return false;
 }
+*/
+// traitement des relations externes par DES jointures.
 
-// traitement des relations externes par une jointure.
-// tant qu'a faire eviter de dupliquer sa declaration,
-// mais c'est une goutte d'eau dans la mer
+function calculer_critere_externe(&$boucle, $id_field, $col_table) {
 
-function calculer_critere_externe(&$boucle, $id_field, $col, $type)
-{
-	global $tables_relations;
-	if ($col_table =  $tables_relations[$type][$col]) {
-		$externe = "$id_field=$col_table." . $boucle->primary;
-		if (!$boucle->where || (!in_array($externe, $boucle->where))) {
-			$boucle->lien = true;
-			$boucle->from[] = "spip_$col_table AS $col_table";
-			$boucle->where[] = $externe;
-			$boucle->group = $id_field;
-			// postgres exige que le champ pour GROUP soit dans le SELECT
-			$boucle->select[] = $id_field;
-		}
-	}
-	return $col_table;
+	static $num;
+
+	$num++;
+	$boucle->lien = true;
+	$boucle->from[] = "spip_$col_table AS $col_table$num";
+	$boucle->where[] = "$id_field=$col_table$num." . $boucle->primary;
+	$boucle->group = $id_field;
+	// postgres exige que le champ pour GROUP soit dans le SELECT
+	$boucle->select[] = $id_field;
+	return $num;
 }
 
 function calculer_param_date($date_compare, $date_orig) {