Mysql
 sql >> Database >  >> RDS >> Mysql

Query SQL per abbinare una stringa separata da virgole a una stringa separata da virgole?

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.