2012-11-20 113 views
3

我在mysql的四个表如下加入4桌已经为部门中的每个用户进行了培训,如果已经完成了显示培训日期,则说明需要培训。MySQL查询根据多个条件

对部门财务所以所需的输出会是这样的:

enter image description here

我试图与下面的代码,但该联接变得不准确,无效的。

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' 

我应该将多个select查询嵌入到一个中吗?任何帮助表示赞赏。

+3

如何查询变得'不准确,invalid'?请解释。 –

+0

嗨马哈茂德,感谢你的时间。 bluefeet将它钉在下面,第二个条件不适合,因此加入的关系不准确。 – Smudger

回答

8

我要去猜测,这个问题是,你只person加入orgstructurecoursescompleted,我想你也需要加入培训:

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 with Demo

结果是:

|  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 | 
+0

图例,谢谢。从来没有意识到你可以有多个“开启”条件进行单个连接。谢谢! – Smudger

+0

嗨,coalesce(c.datecompleted,'n/a')datecompleted做什么?我理解输出,但从来没有见过'coalesce'?再次感谢, – Smudger

+1

@Smudger乐于帮助。 – Taryn