Не е практично да се сравнява която и да е стойност в низ, разделен със запетая, срещу която и да е стойност в друг низ, разделен със запетая, в един предикат.
Можете да използвате FIND_IN_SET() за търсене на една стойност наведнъж.
Това означава, че имате нужда от множество предикати, по един за всяка стойност, която получавате чрез разделяне на входа $subsector_text
. Така че разделете вашата променлива и я съпоставете в поредица от FIND_IN_SET() извиквания.
Не съм тествал следния код, но трябва да ви даде представа за какво говоря:
$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)
...";
Това разбира се ще наложи сканиране на таблица, защото няма начин да се индексира FIND_IN_SET() или друга операция, която търси поднизове. Е, предполагам вашите условия за a.state
и a.sector
ще използва индекс, за да стесни търсенето, преди да приложи условията на FIND_IN_SET().
Разбирам дилемата да работите със система, която сте наследили. Уведомете вашия мениджър, че това трябва да бъде преработено в даден момент, защото никога няма да бъде ефективно или надеждно по начина, по който е проектирано сега.