Mysql
 sql >> Datenbank >  >> RDS >> Mysql

SQL-Abfrage, um eine durch Kommas getrennte Zeichenfolge mit einer durch Kommas getrennten Zeichenfolge abzugleichen?

Es ist nicht praktikabel, einen Wert in einer durch Kommas getrennten Zeichenfolge mit einem beliebigen Wert in einer anderen durch Kommas getrennten Zeichenfolge in einem einzelnen Prädikat abzugleichen.

Sie können FIND_IN_SET() um jeweils einen Wert zu suchen.

Das bedeutet, dass Sie mehrere Prädikate benötigen, eines für jeden Wert, den Sie erhalten, indem Sie Ihre Eingabe $subsector_text aufteilen . Teilen Sie also Ihre Variable auf und ordnen Sie sie einer Reihe von FIND_IN_SET() -Aufrufen zu.

Ich habe den folgenden Code nicht getestet, aber er sollte Ihnen eine Vorstellung davon geben, wovon ich spreche:

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

Dies erzwingt natürlich einen Tabellenscan, da es keine Möglichkeit gibt, FIND_IN_SET() oder eine andere Operation zu indizieren, die nach Teilzeichenfolgen sucht. Nun, ich nehme Ihre Bedingungen auf a.state an und a.sector verwendet einen Index, um die Suche einzugrenzen, bevor die FIND_IN_SET()-Bedingungen angewendet werden.

Ich verstehe das Dilemma, mit einem geerbten System arbeiten zu müssen. Teilen Sie Ihrem Vorgesetzten mit, dass dies irgendwann überarbeitet werden muss, da es so, wie es jetzt entworfen wurde, niemals effizient oder zuverlässig sein wird.