Het is niet praktisch om een waarde in een door komma's gescheiden tekenreeks te vergelijken met een waarde in een andere door komma's gescheiden tekenreeks in één predikaat.
U kunt FIND_IN_SET()
Dit betekent dat je meerdere predikaten nodig hebt, één voor elke waarde die je krijgt door je invoer te splitsen $subsector_text
. Dus splits uw variabele en wijs deze toe aan een reeks FIND_IN_SET()-aanroepen.
Ik heb de volgende code niet getest, maar het zou je een idee moeten geven van waar ik het over heb:
$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)
...";
Dit zal natuurlijk een tabelscan forceren omdat er geen manier is om FIND_IN_SET() te indexeren, of een andere bewerking die naar substrings zoekt. Nou, ik veronderstel dat je voorwaarden op a.state
en a.sector
zal een index gebruiken om de zoekopdracht te verfijnen voordat de FIND_IN_SET() voorwaarden worden toegepast.
Ik begrijp het dilemma van het moeten werken met een systeem dat je hebt geërfd. Laat uw manager weten dat dit op een gegeven moment moet worden herzien, omdat het nooit efficiënt of betrouwbaar zal zijn zoals het nu is ontworpen.