単一クエリで関連レコードを取得する
リレーショナル データベースの領域では、多くの場合、共有する異なるテーブルから複数のレコードをクエリする必要があります。関係。一般的なシナリオは、特定の組織に関するすべての情報とその従業員全員の名を取得することです。
これを実現するには、以下で説明するように、さまざまなデータベース固有の手法を活用できます。
MySQL および PostgreSQL:
MySQL の組み込み GROUP_CONCAT 関数を使用する、またはPostgreSQL の string_agg() を使用すると、特定の組織に関連するすべての従業員のファーストネームを集約して 1 つの文字列に結合できます:
SELECT o.ID, o.Address, o.OtherDetails, GROUP_CONCAT(e.firstname) AS Employees FROM organization AS o JOIN employee AS e ON o.org_id = e.org_id GROUP BY o.org_id;
PostgreSQL 9.0 以降:
PostgreSQL 9.0 以降では STRING_AGG 関数が導入され、より柔軟な処理が可能になりました。連結:
SELECT o.ID, o.Address, o.OtherDetails, STRING_AGG(e.firstname || ' ' || e.lastname, ', ') AS Employees FROM organization AS o JOIN employee AS e ON o.org_id = e.org_id GROUP BY o.org_id;
Oracle:
Oracle は、この目的のために LISTAGG 関数を提供しています:
SELECT o.ID, o.Address, o.OtherDetails, LISTAGG(e.firstname, ', ') AS Employees FROM organization AS o JOIN employee AS e ON o.org_id = e.org_id GROUP BY o.org_id;
MS SQL Server:
MS SQL Server は STRING_AGG を提供しますfunction:
SELECT o.ID, o.Address, o.OtherDetails, STRING_AGG(e.firstname, ', ') AS Employees FROM organization AS o JOIN employee AS e ON o.org_id = e.org_id GROUP BY o.org_id;
他のデータベースのフォールバック ソリューション:
データベースがこれらの組み込み関数をサポートしていない場合は、フォールバック ソリューションを選択できます。組織 ID を入力として受け取り、それに応じて従業員名を連結するストアド プロシージャを作成します。
SELECT o.ID, o.Address, o.OtherDetails, MY_CUSTOM_GROUP_CONCAT_PROCEDURE(o.ID) AS Employees FROM organization AS o;
Byこれらの手法を使用すると、関連テーブルから複数のレコードを効率的に取得し、統合された形式で表示できるため、複数のクエリや行ごとのデータの組み立てが不要になります。
以上が単一のクエリで異なるデータベーステーブルから関連レコードを取得するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。