Valider 0bb4cbee rédigé par esj's avatar esj
Parcourir les fichiers

Complément à [11901]: la suppression de la table principale dans la requête...

Complément à [11901]: la suppression de la table principale dans la requête lorsque celle-ci ne concerne en fait que la jointutre s'étend au cas de plusieurs jointures et non plus une seule.

Application: trouver dans une hiérarchie la rubrique ayant un mot clé d'un certain groupe:

{{{
<BOUCLE2(HIERARCHIE)
		{id_rubrique}
		{tout}
		{type='Squelette'}
		{inverse}
		{0,1}
		{lang_select=non}
}}}
se compile en
{{{
SELECT L1.id_rubrique
FROM  spip_mots_rubriques AS L1 
    INNER JOIN spip_mots AS L2 ON (L2.id_mot = L1.id_mot)
WHERE (L2.type = 'Squelette')
    AND (L1.id_rubrique IN (329,589,645))
GROUP BY L1.id_rubrique
ORDER BY FIELD(L1.id_rubrique, 329,589,645) DESC
LIMIT 0,1
}}}
et non plus en 
{{{
SELECT rubriques.id_rubrique
FROM spip_rubriques AS `rubriques` 
    INNER JOIN spip_mots_rubriques AS L1 ON (L1.id_rubrique = rubriques.id_rubrique)
    INNER JOIN spip_mots AS L2 ON (L2.id_mot = L1.id_mot)
WHERE (L2.type = 'Squelette')
    AND (rubriques.id_rubrique IN (329,589,645))
GROUP BY rubriques.id_rubrique
ORDER BY FIELD(rubriques.id_rubrique, 329,589,645) DESC
LIMIT 0,1
}}}
Il faut le critère {{{ {lang_select=non} }}} autrement le champ lang est mis d'office et empêche la disparition. Il faudrait voir si cette mise d'office e pourrait pas être évitée.
parent 4e3c9c53
Chargement en cours
Chargement en cours
Chargement en cours
Chargement en cours
+4 −3
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -584,15 +584,14 @@ function calculer_select ($select = array(), $from = array(),
	  list($t,$c) = each($from);
	  reset($from);
	  $e = '/\b(' . "$t\\." . join("|" . $t . '\.', $equiv) . ')\b/';
	  if (!( count($equiv) <> 1 OR // a faire sauter un jour
		 strpos($t, ' ') OR // jointure des le depart cf boucle_doc
	  if (!(strpos($t, ' ') OR // jointure des le depart cf boucle_doc
		 calculer_jointnul($t, $select, $e) OR
		 calculer_jointnul($t, $join, $e) OR
		 calculer_jointnul($t, $where, $e) OR
		 calculer_jointnul($t, $having, $e))) {
	    unset($from[$t]);
	    // bien garder les espaces pour le strpos ci-dessus
	    preg_match('/^\s*\w*\s*JOIN\s+(.*?AS\s+(\w+)\s+)ON\s*[(][^.]*[.](\w+)[^)]*[)](.*)$/', $sfrom, $r);
	    $x = preg_match('/^\s*\w*\s*JOIN\s+(.*?AS\s+(\w+)\s+)ON\s*[(][^.]*[.](\w+)[^)]*[)](.*)$/s', $sfrom, $r);
	    $sfrom = $r[1].  $r[4];
	    $e = '/\b' . $t . '\.' . $r[3] .'\b/';
	    $t = $r[2] . '.' . $r[3];
@@ -600,6 +599,8 @@ function calculer_select ($select = array(), $from = array(),
	    $join = remplacer_jointnul($t, $join, $e);
	    $where = remplacer_jointnul($t, $where, $e);
	    $having = remplacer_jointnul($t, $having, $e);
	    $groupby = remplacer_jointnul($t, $groupby, $e);
	    $orderby = remplacer_jointnul($t, $orderby, $e);
	  }
	  $from[-1] = $sfrom; 
	}