自己結合
前に述べたように、テーブル エイリアスを使用する主な理由の 1 つは、単一の SELECT ステートメントで同じテーブルを複数回参照することです。ここに例を示します。
ある商品 (ID は DTNTR ) に問題が見つかり、この商品を製造するサプライヤーが製造した他の商品にも同様の問題があるかどうかを知りたいとします。このクエリでは、まず ID DTNTR の品目を製造するサプライヤーを検索し、次にこのサプライヤーが製造する他の品目を検索する必要があります。
この問題を解決する 1 つの方法は次のとおりです:
入力:
select prod_id,prod_name from products where vend_id = (select vend_id from products where prod_id = 'DTNTR');
出力:
分析: これはサブクエリを使用する最初の解決策です。内部の SELECT ステートメントは単純な検索を実行し、プロダクション ID が DTNTR である品目サプライヤーの Vend_id を返します。この ID は、このサプライヤーが製造したすべてのアイテムを取得するために外部クエリの WHERE 句で使用されます。
次に、結合を使用した同じクエリを見てみましょう:
入力:
select p1.prod_id,p1.prod_name from products as p1,products as p2 where p1.vend_id = p2.vend_id and p2.prod_id = 'DTNTR';
出力:
分析: このクエリで必要な 2 つのテーブルは実際には同じテーブルであるため、products テーブルは FROM 句にあります。 2回登場しました。これは完全に合法ですが、MySQL は products テーブル内のどのインスタンスを参照しているのかを認識しないため、product への参照があいまいになります。 この問題を解決するには、テーブルのエイリアスを使用します。最初に出現する製品はエイリアス p1 で、2 番目に出現するのはエイリアス p2 です。これらのエイリアスをテーブル名として使用できるようになりました。たとえば、SELECT ステートメントは p1 プレフィックスを使用して、必要な列の完全な名前を明示的に指定します。そうでない場合、それぞれ prod_id と prod_name という名前の 2 つの列があるため、MySQL はエラーを返します。 MySQL は、(実際には同じ列であっても) どの列が必要であるかを知りません。 WHERE (p1 の Vend_id と p2 の Vend_id を照合することによって) は、まず 2 つのテーブルを結合し、次に 2 番目のテーブルの prod_id でデータをフィルタリングし、必要なデータを返します。サブクエリの代わりに自己結合を使用する 自己結合は通常、同じテーブルからデータを取得するときに使用されるサブクエリ ステートメントを置き換える外部ステートメントとして使用されます。最終結果は同じですが、場合によっては、結合の処理の方がサブクエリの処理よりもはるかに高速です。両方の方法を試して、どちらのパフォーマンスが優れているかを判断する必要があります。
以上がmysql の高度な結合 - 自己結合の使用例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。