Non è pratico confrontare qualsiasi valore in una stringa separata da virgole con qualsiasi valore in un'altra stringa separata da virgole in un singolo predicato.
Puoi utilizzare FIND_IN_SET() per cercare un valore alla volta.
Ciò significa che hai bisogno di più predicati, uno per ogni valore che ottieni dividendo il tuo input $subsector_text
. Quindi dividi la tua variabile e mappala in una serie di chiamate FIND_IN_SET().
Non ho testato il seguente codice, ma dovrebbe darti un'idea di cosa sto parlando:
$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)
...";
Questo ovviamente forzerà una scansione della tabella perché non c'è modo di indicizzare FIND_IN_SET() o qualsiasi altra operazione che cerchi sottostringhe. Bene, suppongo che le tue condizioni su a.state
e a.sector
utilizzerà un indice per restringere la ricerca prima di applicare le condizioni FIND_IN_SET().
Capisco il dilemma di dover lavorare con un sistema che hai ereditato. Fai sapere al tuo manager che questo deve essere rifattorizzato a un certo punto, perché non sarà mai efficiente o affidabile nel modo in cui è stato progettato ora.