Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Consulta SQL para corresponder uma string separada por vírgula com uma string separada por vírgula?


Não é prático combinar qualquer valor em uma string separada por vírgula com qualquer valor em outra string separada por vírgula em um único predicado.

Você pode usar FIND_IN_SET() para procurar um valor de cada vez.

Isso significa que você precisa de vários predicados, um para cada valor obtido dividindo sua entrada $subsector_text . Portanto, divida sua variável e mapeie-a em uma série de chamadas FIND_IN_SET().

Não testei o código a seguir, mas deve dar uma ideia do que estou falando:
$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)
...";

Isso obviamente forçará uma varredura de tabela porque não há como indexar FIND_IN_SET(), ou qualquer outra operação que procure por substrings. Bem, suponho que suas condições em a.state e a.sector usará um índice para restringir a pesquisa antes de aplicar as condições FIND_IN_SET().

Eu entendo o dilema de ter que trabalhar com um sistema que você herdou. Deixe seu gerente saber que isso precisa ser refatorado em algum momento, porque nunca será eficiente ou confiável do jeito que foi projetado agora.