Il n'est pas pratique de faire correspondre une valeur dans une chaîne séparée par des virgules à une valeur dans une autre chaîne séparée par des virgules dans un seul prédicat.
Vous pouvez utiliser FIND_IN_SET() pour rechercher une valeur à la fois.
Cela signifie que vous avez besoin de plusieurs prédicats, un pour chaque valeur que vous obtenez en divisant votre entrée $subsector_text
. Divisez donc votre variable et mappez-la dans une série d'appels FIND_IN_SET().
Je n'ai pas testé le code suivant, mais il devrait vous donner une idée de ce dont je parle :
$subsector_array = array_map('intval', explode(',', $subsector_text));
$subsector_terms = array_map(
function ($id) { return "FIND_IN_SET($id, a.subsector)"; },
$subsector_array);
$subsector_expr = implode(' OR ', $subsector_terms);
$sql = "
SELECT ...
WHERE a.state = 1
AND a.sector = '$sector'
AND ($subsector_expr)
...";
Cela forcera bien sûr un balayage de table car il n'y a aucun moyen d'indexer FIND_IN_SET(), ou toute autre opération qui recherche des sous-chaînes. Eh bien, je suppose que vos conditions sur a.state
et a.sector
utilisera un index pour affiner la recherche avant d'appliquer les conditions FIND_IN_SET().
Je comprends le dilemme de devoir travailler avec un système dont vous avez hérité. Faites savoir à votre responsable que cela doit être refactorisé à un moment donné, car il ne sera jamais efficace ou fiable tel qu'il est conçu actuellement.