Det är inte praktiskt att matcha något värde i en kommaseparerad sträng mot något värde i en annan kommaseparerad sträng i ett enda predikat.
Du kan använda FIND_IN_SET() för att söka efter ett värde åt gången.
Det betyder att du behöver flera predikat, ett för varje värde du får genom att dela upp din indata $subsector_text
. Så dela upp din variabel och mappa den till en serie FIND_IN_SET()-anrop.
Jag har inte testat följande kod, men den borde ge dig en uppfattning om vad jag pratar om:
$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)
...";
Detta kommer naturligtvis att tvinga fram en tabellsökning eftersom det inte finns något sätt att indexera FIND_IN_SET(), eller någon annan operation som söker efter delsträngar. Tja, jag antar att dina villkor för a.state
och a.sector
kommer att använda ett index för att begränsa sökningen innan villkoren FIND_IN_SET() tillämpas.
Jag förstår dilemmat med att behöva arbeta med ett system som du ärvt. Låt din chef veta att det här behöver omstruktureras någon gång, eftersom det aldrig kommer att vara effektivt eller tillförlitligt som det är designat nu.