Mysql
 sql >> Base de données >  >> RDS >> Mysql

Requête SQL pour faire correspondre une chaîne séparée par des virgules à une chaîne séparée par des virgules ?

Il n'est pas pratique de faire correspondre une valeur dans une chaîne séparée par des virgules à une valeur dans une autre chaîne séparée par des virgules dans un seul prédicat.

Vous pouvez utiliser FIND_IN_SET() pour rechercher une valeur à la fois.

Cela signifie que vous avez besoin de plusieurs prédicats, un pour chaque valeur que vous obtenez en divisant votre entrée $subsector_text . Divisez donc votre variable et mappez-la dans une série d'appels FIND_IN_SET().

Je n'ai pas testé le code suivant, mais il devrait vous donner une idée de ce dont je parle :

$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)
...";

Cela forcera bien sûr un balayage de table car il n'y a aucun moyen d'indexer FIND_IN_SET(), ou toute autre opération qui recherche des sous-chaînes. Eh bien, je suppose que vos conditions sur a.state et a.sector utilisera un index pour affiner la recherche avant d'appliquer les conditions FIND_IN_SET().

Je comprends le dilemme de devoir travailler avec un système dont vous avez hérité. Faites savoir à votre responsable que cela doit être refactorisé à un moment donné, car il ne sera jamais efficace ou fiable tel qu'il est conçu actuellement.