No es práctico hacer coincidir ningún valor en una cadena separada por comas con ningún valor en otra cadena separada por comas en un solo predicado.
Puede usar FIND_IN_SET() para buscar un valor a la vez.
Esto significa que necesita múltiples predicados, uno para cada valor que obtiene al dividir su entrada $subsector_text
. Así que divida su variable y mapéela en una serie de llamadas FIND_IN_SET().
No he probado el siguiente código, pero debería darte una idea de lo que estoy hablando:
$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)
...";
Por supuesto, esto forzará un escaneo de tabla porque no hay forma de indexar FIND_IN_SET(), o cualquier otra operación que busque subcadenas. Bueno, supongo que tus condiciones en a.state
y a.sector
utilizará un índice para restringir la búsqueda antes de aplicar las condiciones FIND_IN_SET().
Entiendo el dilema de tener que trabajar con un sistema que heredaste. Hágale saber a su gerente que esto debe refactorizarse en algún momento, porque nunca será eficiente o confiable de la forma en que está diseñado ahora.