sql >> Base de Datos >  >> RDS >> Mysql

¿Consulta SQL para hacer coincidir una cadena separada por comas con una cadena separada por comas?

No es práctico hacer coincidir ningún valor en una cadena separada por comas con ningún valor en otra cadena separada por comas en un solo predicado.

Puede usar FIND_IN_SET() para buscar un valor a la vez.

Esto significa que necesita múltiples predicados, uno para cada valor que obtiene al dividir su entrada $subsector_text . Así que divida su variable y mapéela en una serie de llamadas FIND_IN_SET().

No he probado el siguiente código, pero debería darte una idea de lo que estoy hablando:

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

Por supuesto, esto forzará un escaneo de tabla porque no hay forma de indexar FIND_IN_SET(), o cualquier otra operación que busque subcadenas. Bueno, supongo que tus condiciones en a.state y a.sector utilizará un índice para restringir la búsqueda antes de aplicar las condiciones FIND_IN_SET().

Entiendo el dilema de tener que trabajar con un sistema que heredaste. Hágale saber a su gerente que esto debe refactorizarse en algún momento, porque nunca será eficiente o confiable de la forma en que está diseñado ahora.