calculer_select, jointures complexes
Bonjour,
J'ai observé un dysfonctionnement dans les recherches sur des données traitées par le plugin forms_and_tables_2_0; cependant, je rapporte ce problème ici car il ne me semble pas évident que la correction doive se faire du côté de ce plugin.
Le problème vient d'une combinaison du critère fusion avec le critère recherche_donnee, défini dans le plugin. La requête SQL échoue de la façon suivante:
"Erreur SQL 1052 Column 'id_donnee' in field list is ambiguous"
Voici le détail de la requête:
SELECT forms_donnees.id_auteur, forms_donnees.id_form, forms_donnees.id_donnee, id_donnee, forms_donnees.statut, forms_donnees.rang, forms_donnees.date, forms_donnees.ip
FROM testsite_forms_donnees AS forms_donnees
INNER JOIN testsite_forms_donnees_champs AS L2 ON ( L2.id_donnee = forms_donnees.id_donnee )
WHERE ((forms_donnees.statut IN ('prepa','prop','propose','publie','refuse')))
AND (forms_donnees.id_form = 1)
AND (L2.valeur LIKE '%TOTO%')
AND (forms_donnees.confirmation = "valide")
GROUP BY id_donnee
ORDER BY forms_donnees.date DESC
J'ai réalisé un patch qui corrige les ambiguïtés dans les clauses SELECT et GROUP BY; la même requête devient alors:
SELECT forms_donnees.id_auteur, forms_donnees.id_form, forms_donnees.id_donnee, L2.id_donnee AS id_donnee, forms_donnees.statut, forms_donnees.rang, forms_donnees.date, forms_donnees.ip
FROM testsite_forms_donnees AS forms_donnees
INNER JOIN testsite_forms_donnees_champs AS L2 ON ( L2.id_donnee = forms_donnees.id_donnee )
WHERE ((forms_donnees.statut IN ('prepa','prop','propose','publie','refuse')))
AND (forms_donnees.id_form = 1)
AND (L2.valeur LIKE '%TOTO%')
AND (forms_donnees.confirmation = "valide")
GROUP BY L2.id_donnee
ORDER BY forms_donnees.date DESC
Il me semble que la correction doit plutôt porter sur calculer_select (spip/ecrire/public/composer.php) que sur critere_recherche_donnee_dist (forms_and_tables_2_0/public/forms_boucles.php), parce que calculer_select peut être amenée à créer le nom de clef pour la jointure automatiquement (composer.php#calculer_select: // si le nom de la jointure n'a pas ete specifiee, on prend Lx avec x sont rang dans la liste pour compat avec ancienne convention) et gère de toute façon par ailleurs la mise en oeuvre de ce nommage en créant l'alias pour la table. Il parait donc logique qu'elle gère aussi cette mise en oeuvre pour l'alias de la colonne impliquée dans l'opération de jointure.
Le patch ci-joint vient modifier calculer_select en ce sens.
Bon WE,
-- Jean-Jacques Puig