ホームページ > データベース > mysql チュートリアル > FIND_IN_SET() と IN(): 複数テーブルのクエリに各関数をいつ使用する必要がありますか?

FIND_IN_SET() と IN(): 複数テーブルのクエリに各関数をいつ使用する必要がありますか?

Patricia Arquette
リリース: 2024-12-11 08:02:13
オリジナル
433 人が閲覧しました

FIND_IN_SET() vs. IN(): When Should I Use Each Function for Multi-Table Queries?

FIND_IN_SET() と IN(): クエリの違いを理解する

複数のテーブルからデータをクエリする場合、構文がどのようにクエリを実行するかを理解することが重要です。使用は結果に影響します。次の状況を考えてみましょう:

注文用と会社用の 2 つのテーブルがあります。 order テーブルにはカンマ区切りの会社 ID を含む AttachCompanyIDs 列が含まれており、会社テーブルには CompanyID 列と name 列が含まれています。

FIND_IN_SET() によるクエリ

以下のクエリ特定の注文に関連付けられたすべての会社名を取得できます:

SELECT name FROM orders, company
WHERE orderID = 1 AND FIND_IN_SET(companyID, attachedCompanyIDs)
ログイン後にコピー

このクエリすべての会社名 (Company 1、Another Company、および StackOverflow) が正常に返されます。

IN() を使用したクエリ

ただし、FIND_IN_SET( を置き換えてクエリを少し変更すると、 ) IN() を使用すると、結果が変わります:

SELECT name FROM orders, company
WHERE orderID = 1 AND companyID IN (attachedCompanyIDs)
ログイン後にコピー

この場合、クエリは最初の会社名のみを返します。 AttachedCompanyIDs 列にリストされています: Company 1.

違いを理解する

この相違の理由は、これら 2 つの関数によるattachedCompanyID の処理方法にあります。 column.

  • FIND_IN_SET(): この関数は、attachedCompanyID の文字列全体を考慮し、その中に companyID が存在するかどうかを確認します。
  • IN( ): この関数は、attachedCompanyID をスカラー値として解釈します (例:

IN() の潜在的な問題

データベースの例では、attachedCompanyIDs は文字列として保存されます。 。 IN() 関数で使用すると、自動的に整数にキャストされます。ただし、このキャストではカンマの前の最初の桁のみが考慮されます。したがって、attachedCompanyIDs リストの最初の会社 ID のみが考慮されます。

考えられる解決策

  • 直接テーブル結合を使用します: 結合会社名を取得するには、companyID 列の order および company テーブルを使用します。このアプローチでは正確な結果が得られますが、各注文に多数の会社 ID が関連付けられている場合はパフォーマンスに影響を与える可能性があります。
  • より高度なクエリを使用します。 の値の数が限られている場合は、 AttachedCompanyIDs 列では、次のようなより複雑なクエリを使用できます。

    SELECT name
    FROM orders
    CROSS JOIN (
      SELECT 1 AS pos
      UNION ALL
      SELECT 2 AS pos
      UNION ALL
      SELECT 3 AS pos
      UNION ALL
      SELECT 4 AS pos
      UNION ALL
      SELECT 5 AS pos
    ) q
    JOIN company
    ON companyID = CAST(NULLIF(SUBSTRING_INDEX(attachedCompanyIDs, ',', -pos), SUBSTRING_INDEX(attachedCompanyIDs, ',', 1 - pos)) AS UNSIGNED)
    ログイン後にコピー

Thisクエリは、SUBSTRING_INDEX() 関数を使用して、attachedCompanyIDs 文字列から個々の企業 ID を抽出します。

以上がFIND_IN_SET() と IN(): 複数テーブルのクエリに各関数をいつ使用する必要がありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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