Projet

Général

Profil

Anomalie #948

Erreur dans une recherche avancée avec plus d'un champ dynamique

Ajouté par Guillaume Rousse il y a plus d'un an. Mis à jour il y a plus d'un an.

Statut:
Fermé
Priorité:
Normal
Assigné à:
-
Catégorie:
-
Version cible:
-
Début:
13/02/2016
Echéance:
% réalisé:

100%

Version utilisée:

Description

Une recherche avancée utilisant plus d'un champ dynamique échoue, parce qu'elle produit une requête SQL impossible à satisfaire:
SELECT DISTINCT a.*
FROM galette_adherents AS a
INNER JOIN galette_statuts AS p ON a.id_statut=p.id_statut
LEFT JOIN galette_cotisations AS ct ON ct.id_adh=a.id_adh
LEFT JOIN galette_dynamic_fields AS df ON df.item_id=a.id_adh
LEFT JOIN galette_field_contents_1 AS cdf1 ON cdf1.id=df.field_val
LEFT JOIN galette_field_contents_2 AS cdf2 ON cdf2.id=df.field_val
WHERE
df.field_form = 'adh' AND
df.field_id = 1 AND
LOWER = 'value for field 1' AND
df.field_form = 'adh' AND
df.field_id = 2 AND
LOWER = 'value for field 2'

La requête ajoute une première jointure unique vers la table galette_dynamic_fields, puis une jointure supplémentaire pour chaque champ de type liste vers la table de contenu, puis ajoute l'ensemble des conditions dans la clause WHERE, ce qui amène à une condition df.field_id = 1 AND df.field_id = 2, impossible à satisfaire...

La solution consiste à ajouter une jointure plus complexe pour pour chaque champ dynamique dans la clause FROM, et à ne garder dans la clause WHERE que les seules conditions sur les valeurs demandées, sur ce modèle:
SELECT DISTINCT a.*
FROM galette_adherents AS a
INNER JOIN galette_statuts AS p ON a.id_statut=p.id_statut
LEFT JOIN galette_cotisations AS ct ON ct.id_adh=a.id_adh
LEFT JOIN (SELECT item_id, val FROM galette_dynamic_fields AS df LEFT join galette_field_contents_1 AS dfc1 ON df.field_val=id WHERE df.field_form = 'adh' AND df.field_id=1) AS df1 ON a.id_adh=df1.item_id
LEFT JOIN (SELECT item_id, val FROM galette_dynamic_fields AS df LEFT join galette_field_contents_2 AS dfc2 ON df.field_val=id WHERE df.field_form = 'adh' AND df.field_id=2) AS df2 ON a.id_adh=df2.item_id
WHERE
LOWER = 'value for field 1' AND
LOWER = 'value for field 2'

Révisions associées

Révision 398a6c02
Ajouté par Guillaume Rousse il y a plus d'un an

Fix usage of dynamic fields in advanced research; fixes #948

closes: #948

Historique

#1 Mis à jour par Guillaume Rousse il y a plus d'un an

  • Statut changé de Nouveau à Résolu
  • % réalisé changé de 0 à 100

#2 Mis à jour par Johan Cwiklinski il y a plus d'un an

  • Statut changé de Résolu à Fermé

Formats disponibles : Atom PDF