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.
IN() の潜在的な問題
データベースの例では、attachedCompanyIDs は文字列として保存されます。 。 IN() 関数で使用すると、自動的に整数にキャストされます。ただし、このキャストではカンマの前の最初の桁のみが考慮されます。したがって、attachedCompanyIDs リストの最初の会社 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 サイトの他の関連記事を参照してください。