4

以下のように、mysqlに4つのテーブルがあります。

ここに画像の説明を入力

ここに画像の説明を入力

私がやりたいことは、テーブルを結合して、部門内の各ユーザーに対してトレーニングが行われたかどうかを示し、行われている場合はトレーニングの日付を表示し、そうでない場合はトレーニングが必要であると言います。

したがって、部門財務の望ましい出力は次のようになります。

ここに画像の説明を入力

以下のコードを試してみましたが、結合が不正確になり、無効になります。

select o.person, o.job, j.risk, r. training,c.course,
    c.person,c.datecompleted 
from orgstructure o 
left outer join jobsrisks j 
    on o.job=j.job 
left outer join risktraining r 
    on j.risk=r.risk 
left outer join coursescompleted c 
    on o.person=c.person 
where o.department='finance'

複数の選択クエリを 1 つに埋め込む必要がありますか? どんな助けでも大歓迎です。

4

1 に答える 1

15

その問題は、あなたがにのみ参加orgstructureしていることだと推測します。トレーニングにも参加する必要があると思います。coursescompletedperson

select o.person, 
  o.job, 
  j.risk, 
  r.training,
  c.course,
  c.person,
  c.datecompleted 
from orgstructure o 
left outer join jobsrisks j 
  on o.job=j.job 
left outer join risktraining r 
  on j.risk=r.risk 
left outer join coursescompleted c 
  on o.person=c.person 
  and r.training = c.course   --- add this
where o.department='finance'

その人が仕事に関連する各リスクのコースを修了している場合は、その人に加えて参加する必要があります。

クエリ全体をまとめると、次のようになります。

select o.person, 
  o.job, 
  j.risk, 
  r.training,
  case when c.course is null then 'no' else 'yes' end TrainingCompleted,
  coalesce(c.datecompleted, 'n/a') datecompleted
from orgstructure o 
left outer join jobsrisks j 
  on o.job=j.job 
left outer join risktraining r 
  on j.risk=r.risk 
left outer join coursescompleted c 
  on o.person=c.person 
  and r.training = c.course   
where o.department='finance'

デモで SQL Fiddle を参照してください

結果は次のとおりです。

|        PERSON |        JOB |                     RISK |                  TRAINING | TRAININGCOMPLETED |       DATECOMPLETED |
-------------------------------------------------------------------------------------------------------------------------------
| taylor chetty |    manager |                   safety |          induction course |                no |                 n/a |
| taylor chetty |    manager |                 security |           security course |                no |                 n/a |
| bill thompson | data clerk |              bad posture | personal wellbeing course |                no |                 n/a |
| bill thompson | data clerk | repetitive strain injury |            nursing course |               yes | 2000-04-13 00:00:00 |
| bill thompson | data clerk |                   safety |          induction course |               yes | 2007-12-04 00:00:00 |
|     ann brown | data clerk |              bad posture | personal wellbeing course |                no |                 n/a |
|     ann brown | data clerk | repetitive strain injury |            nursing course |                no |                 n/a |
|     ann brown | data clerk |                   safety |          induction course |                no |                 n/a |
于 2012-11-20T15:17:22.053 に答える