Nie jest praktyczne dopasowywanie dowolnej wartości w ciągu rozdzielanym przecinkami do dowolnej wartości w innym ciągu rozdzielanym przecinkami w pojedynczym predykacie.
Możesz użyć ZNAJDŹ_W_ZESTAWIE() aby wyszukiwać jedną wartość na raz.
Oznacza to, że potrzebujesz wielu predykatów, po jednym dla każdej wartości otrzymanej przez podzielenie danych wejściowych na $subsector_text
. Podziel zmienną i zmapuj ją na serię wywołań FIND_IN_SET().
Nie testowałem poniższego kodu, ale powinien dać ci wyobrażenie o czym mówię:
$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)
...";
To oczywiście wymusi skanowanie tabeli, ponieważ nie ma sposobu na indeksowanie FIND_IN_SET() ani żadnej innej operacji, która szuka podciągów. Cóż, przypuszczam, że twoje warunki na a.state
i a.sector
użyje indeksu, aby zawęzić wyszukiwanie przed zastosowaniem warunków FIND_IN_SET().
Rozumiem dylemat pracy z systemem, który odziedziczyłeś. Poinformuj swojego przełożonego, że w pewnym momencie musi to zostać zrefaktoryzowane, ponieważ nigdy nie będzie wydajne ani niezawodne w sposób, w jaki jest teraz zaprojektowane.