2

このクエリは少し基本的なものだと思います。SQLについてもっと知っておく必要がありますが、結合についてはまだ多くのことを行っていません。これがここでの解決策だと思います。

私が持っているのは、人々の表と彼らが持つ職務の表です。1人の人が複数の仕事をすることができます。私は、1人の人ごとに、詳細と仕事の役割を含む1つの結果セットを作成したいと考えています。

質問をより簡単に理解できるように、2つのサンプルテーブル(peopleとjob_roles)を以下に示します。

人々

id | 名前| email_address | 電話番号
 1 | ポール| paul@example.com | 123456
 2 | ボブ| bob@example.com | 567891
 3 | バート| bart@example.com | 987561

job_roles

id | person_id | job_title | デパートメント
  1 | 1 | 秘書| 時間
  2 | 1 | アシスタント| メディア
  3 | 2 | マネージャー| それ
  4 | 3 | 財務担当者| ファイナンス
  4 | 3 | マネージャー| それ

一人一人とその役割を出力できるように

名前:ポール
メールアドレス:paul@example.com
電話番号:123456
職務:
人事部長官
メディア部門のアシスタント
_______
名前:ボブ
メールアドレス:bob@example.com
電話番号:567891
職務:
IT部門のマネージャー

では、上記の例のように、各個人情報(peopleテーブルから)とジョブの詳細(job_rolesテーブルから)を取得して出力するにはどうすればよいでしょうか。それは、彼らの仕事と関連する部門を、出力のために分割できる仕事の列にマージするある種の方法だと思いますが、もっと良い方法があり、SQLはどのように見えるでしょうか?

ありがとう

ポール

PSそれが何か違いを生むならそれはmySQLデータベースになるでしょう

4

4 に答える 4

3

単純な結合のように見えます。

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つのレベルがある場合は、さらに多くの作業を行う必要があります。そのため、それを処理するためのレポートパッケージがあります。

ですから、難しいことではありません。少し注意が必要です。

于 2010-06-23T20:02:20.167 に答える
2

RE:

SQLが何か賢いことをして、行をうまく結合できることを望んでいたので、基本的に、その人のジョブを含むジョブ列がありました。

あなたはかなり近づくことができます

SELECT  p.id, p.name, p.email_address, p.phone_number,
group_concat(concat(job_title, ' for ', department, ' department')  SEPARATOR '\n') AS JobRoles
FROM People AS p 
    INNER JOIN job_roles AS r ON p.id = r.person_id
GROUP BY p.id, p.name, p.email_address, p.phone_number
 ORDER BY p.name;
于 2010-06-23T21:57:08.610 に答える
0

希望どおりに実行すると、結果セットの配列に無限の列が含まれる可能性があり、非常に面倒になります。たとえば、jobsテーブルに10回参加したままにして、job1、job2、..job10を取得できます。

単一の結合を実行してから、PHPを使用して、名前IDが1つの行から次の行まで同じであるかどうかを確認します。

于 2010-06-23T20:55:45.590 に答える
0

1つの方法は、テーブルを外部結合してから、を使用してそれらを配列にロードすることです。

$people_array =array(); 
while($row1=mysql_fetch_assoc($extract1)){ 
$people_array[] = $row1;  
} 

次に、を使用してループします

 for ($x=0;$x<=sizeof($people_array;) 
    {  
echo $people_array[$x][id]; 
echo $people_array[$x][name]; 

for($y=0;$y<=$number_of_roles;$y++) 
{ 
 echo $people_array[$x][email_address]; 
 echo $people_array[$x][phone_number]; 
    $x++; 
} 
     } 

クエリとループを少し試してみる必要があるかもしれませんが、一般的には必要なことを実行する必要があります。上記のように機能するには、すべての人が同じ数の役割を持っている必要がありますが、空白を埋めることができる場合があります。あなたのテーブルで

于 2010-06-23T23:17:40.070 に答える