単一の述部内の別のコンマ区切り文字列の値とコンマ区切り文字列の値を一致させることは実用的ではありません。
FIND_IN_SET()<を使用できます/ a> 一度に1つの値を検索します。
これは、入力$subsector_text
を分割して取得する値ごとに1つずつ、複数の述語が必要であることを意味します。 。したがって、変数を分割して、一連のFIND_IN_SET()呼び出しにマップします。
次のコードはテストしていませんが、私が何について話しているのかがわかるはずです。
$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)
...";
もちろん、FIND_IN_SET()や、部分文字列を検索するその他の操作にインデックスを付ける方法がないため、これによりテーブルスキャンが強制されます。ええと、a.state
の条件だと思います およびa.sector
FIND_IN_SET()条件を適用する前に、インデックスを使用して検索を絞り込みます。
あなたが受け継いだシステムで作業しなければならないというジレンマを理解しています。これは、現在の設計方法では効率的または信頼性が高くないため、ある時点でリファクタリングする必要があることをマネージャーに知らせてください。