ホームページ >データベース >mysql チュートリアル >カンマ区切りの MySQL フィールドで複数の文字列を効率的に検索するにはどうすればよいですか?

カンマ区切りの MySQL フィールドで複数の文字列を効率的に検索するにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2025-01-11 19:31:43875ブラウズ

How Can I Efficiently Search for Multiple Strings in a Comma-Separated MySQL Field?

MySQL: 複数文字列 find_in_set へのより効率的なアプローチ

MySQL の find_in_set 関数は、カンマ区切り値内の単一文字列の検索に限定されています。 これは、複数の検索文字列に一致するレコードを同時に検索する必要がある場合に課題となります。

課題:

目標は、カンマ区切り値を含むフィールドに指定された検索文字列すべてが含まれるレコードを識別することです。 たとえば、「a,b,c,d」内で「a,b,c」を検索すると、一致するものが得られます。

優れたソリューション:

find_in_set 演算子を使用して複数の OR 呼び出しを連鎖させる (これは非効率的になる可能性があります) 代わりに、より効果的な方法では、より構造化された FIND_IN_SET 句内で WHERE 関数を利用します。

<code class="language-sql">WHERE FIND_IN_SET('val1', setcolumn) > 0
  AND FIND_IN_SET('val2', setcolumn) > 0
  AND FIND_IN_SET('val3', setcolumn) > 0</code>

ここで:

  • setcolumn は、カンマ区切りの値を持つフィールドを表します。
  • val1val2val3 などは検索文字列です。

説明:

このアプローチでは、AND を使用して、すべての 検索文字列が setcolumn に存在することを確認します。 各 FIND_IN_SET 呼び出しは、文字列が見つかった場合は位置を返します (0 より大きい値)。それ以外の場合は、0 を返します。AND 条件は、指定されたすべての文字列を含むレコードのみが返されることを保証します。

例:

<code class="language-sql">SELECT * FROM table
WHERE FIND_IN_SET('a', setcolumn) > 0
  AND FIND_IN_SET('b', setcolumn) > 0
  AND FIND_IN_SET('c', setcolumn) > 0;</code>

このクエリは、setcolumn に 'a'、'b'、および 'c' が含まれるレコードのみを返します。

重要な考慮事項:

この方法は通常、REGEXP アプローチよりも効率的ですが、カンマ区切りの値をデータベース フィールドに格納することは、多くの場合、不適切なデータベース設計であると考えられることに注意してください。データベースを正規化する (関係を表す別のテーブルを作成する) ことは、パフォーマンスとデータの整合性にとって、長期的にははるかに優れたソリューションです。 このアプローチは主に、既存の正規化されていないデータに対する回避策です。

以上がカンマ区切りの MySQL フィールドで複数の文字列を効率的に検索するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。