Project

General

Profile

Anomalie #948

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

Added by Guillaume Rousse almost 4 years ago. Updated over 3 years ago.

Status:
Fermé
Priority:
Normal
Assignee:
-
Category:
-
Target version:
-
Start date:
02/13/2016
Due date:
% Done:

100%

Estimated time:
Version utilisée:
Vote:

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'

Associated revisions

Revision 398a6c02 (diff)
Added by Guillaume Rousse over 3 years ago

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

closes: #948

History

#1

Updated by Guillaume Rousse over 3 years ago

  • Status changed from Nouveau to Résolu
  • % Done changed from 0 to 100
#2

Updated by Johan Cwiklinski over 3 years ago

  • Status changed from Résolu to Fermé

Also available in: Atom PDF