sql >> データベース >  >> RDS >> Mysql

カンマ区切りの文字列をカンマ区切りの文字列と照合するSQLクエリ?

    単一の述部内の別のコンマ区切り文字列の値とコンマ区切り文字列の値を一致させることは実用的ではありません。

    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()条件を適用する前に、インデックスを使用して検索を絞り込みます。

    あなたが受け継いだシステムで作業しなければならないというジレンマを理解しています。これは、現在の設計方法では効率的または信頼性が高くないため、ある時点でリファクタリングする必要があることをマネージャーに知らせてください。



    1. ダンプファイルMySQL5.6.10

    2. SQL-MySQLデータ(タイムスタンプとステータスメッセージを含む行のセット)からすべてのダウンタイムとダウンタイムの長さを検索します

    3. デフォルト値としてNULLを持たないテーブル内のすべての列名のリストを取得しますか?

    4. MySQLクエリは、特定のタグの組み合わせに基づいて行をフェッチすると、不要な行を返します