単純な結合のように見えます。
SELECT p.*, j.*
FROM People AS p INNER JOIN Roles AS r ON p.id = r.person_id
ORDER BY p.name;
残りの作業はフォーマットです。これは、レポートパッケージで行うのが最適です。
迅速な対応に感謝します。これは良いスタートのようですが、1人あたり複数の行が表示されます(コメントでフォーマットできないように見えるため、これがテーブルであると想像する必要があります)。
id | Name | email_address | phone_number | job_role | department
1 | paul | paul@example.com | 123456 | secretary | HR
1 | paul | paul@example.com | 123456 | assistant | media
2 | bob | bob@example.com | 567891 | manager | IT
可能であれば、理想的にはすべての職務を含む1行を1行にしたいと思います。
それはあなたのDBMSに依存しますが、ほとんどの利用可能なものはRVA(関係値属性)をサポートしていません。必要なのは、ユーザーに関連付けられたテーブルのように、結果の職務と部門の部分を含めることです。
+----+------+------------------+--------------+------------------------+
| id | Name | email_address | phone_number | dept_role |
+----+------+------------------+--------------+------------------------+
| | | | | +--------------------+ |
| | | | | | job_role | dept | |
| 1 | paul | paul@example.com | 123456 | | secretary | HR | |
| | | | | | assistant | media | |
| | | | | +--------------------+ |
+----+------+------------------+--------------+------------------------+
| | | | | +--------------------+ |
| | | | | | job_role | dept | |
| 2 | bob | bob@example.com | 567891 | | manager | IT | |
| | | | | +--------------------+ |
+----+------+------------------+--------------+------------------------+
これは必要な情報を正確に表していますが、通常はオプションではありません。
したがって、次に何が起こるかは、レポート生成ツールによって異なります。私が最もよく知っているもの(Informix ACE、Informix SQLの一部、InformixDBMSで使用するためにIBMから入手可能)を使用すると、データがソートされていることを確認してから、名前、電子メールアドレス、電話番号を出力するだけです。レポートの「BEFOREGROUPOFid」セクション、および「ON EVERY ROW」セクションでは、役割と部門の情報のみを処理(印刷)します。
多くの場合、レポートのフォーマットをデータ取得操作から分離することをお勧めします。これは、選択したデータのフォーマットを支援するための通常とは異なる機能がDBMSにない限り、必要な場合の例です。
ああ、それは非常に複雑に聞こえますが、PHPページのmySQLデータベースで簡単に実行できるものではありませんか?
RVAのもの-そうです、それはMySQLとPHP用ではありません。
一方、これを大まかに行うレポート(ユーザーに表示するためにフォーマットされたクエリからの結果を意味する)は数百万あります。それらの専門用語は「コントロールブレイクレポート」ですが、基本的な考え方は難しくありません。
最後に処理した「id」番号のレコードを保持します。これを-1または0に初期化できます。現在のレコードのID番号が前の番号と異なる場合は、新しいユーザーがいるため、開始する必要があります。新しいユーザーの新しい出力行のセットを出力し、名前、電子メールアドレス、電話番号を出力します(最後に処理されたID番号を変更します)。現在のレコードのID番号が同じである場合は、職務と部門の情報(名前、電子メールアドレス、電話番号ではない)を処理するだけです。「ブレーク」は、ID番号が変更されたときに発生します。単一レベルのコントロールブレイクで、それは難しいことではありません。4つまたは5つのレベルがある場合は、さらに多くの作業を行う必要があります。そのため、それを処理するためのレポートパッケージがあります。
ですから、難しいことではありません。少し注意が必要です。