ホームページ > データベース > mysql チュートリアル > MySQL FIND_IN_SET() と IN(): IN() がカンマ区切りの ID で最初に一致したものだけを返すのはなぜですか?

MySQL FIND_IN_SET() と IN(): IN() がカンマ区切りの ID で最初に一致したものだけを返すのはなぜですか?

Mary-Kate Olsen
リリース: 2024-12-11 10:40:12
オリジナル
577 人が閲覧しました

MySQL FIND_IN_SET() vs IN(): Why Does IN() Only Return the First Match with Comma-Separated IDs?

FIND_IN_SET() と IN(): MySQL の違いを理解する

質問:

MySQL には、「orders」と「company」という 2 つのテーブルがあります。 「orders」の「attachedCompanyIDs」列には、「company」の行を参照する ID のカンマ区切りのリストが格納されます。 FIND_IN_SET() を使用して注文に関連付けられた会社名をクエリすると、期待どおりの結果が得られます。ただし、代わりに IN() を使用すると、最初に一致した会社のみが返されます。なぜこのようなことが起こるのでしょうか?

答え:

attachedCompanyIDs 列は、VARCHAR 型のスカラー値です。 IN() を使用する場合、MySQL は文字列を整数にキャストし、最初の数値以外の文字 (つまり、カンマ) で切り捨てます。これは、attachedCompanyIDs に複数の値が含まれている場合、IN 比較では最初の値のみが考慮されることを意味します。

解決方法:

特定のシナリオに応じて、次のものが考えられます。この問題に対するいくつかの回避策:

  1. ARRAY タイプを使用する(PostgreSQL のみ): PostgreSQL は配列データ型をサポートしており、カンマ区切りのリストを配列として保存できます。これにより、ANY() を使用して、attachedCompanyID の値を companyID 列と正しく比較できるようになります。
  2. 制限された値リスト:attachedCompanyID のカンマ区切りリストの長さが制限されている場合、一連の UNION ALL クエリを使用して、文字列を複数の行に変換できます。これにより、各行で IN 比較を個別に実行できるようになります。

追加の考慮事項:

  1. パフォーマンスへの影響: FIND_IN_SET() を使用すると、特に大規模なデータセットの場合、パフォーマンスの問題が発生する可能性があります。前述の代替ソリューションを使用すると、これらのシナリオでパフォーマンスを向上させることができます。
  2. 可読性とメンテナンス: 代替ソリューションは、FIND_IN_SET() を使用する場合よりも複雑になり、可読性が低下する可能性があります。選択するときは、パフォーマンスと保守性のトレードオフを慎重に考慮してください。

以上がMySQL FIND_IN_SET() と IN(): IN() がカンマ区切りの ID で最初に一致したものだけを返すのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート