2012-03-11 53 views
0

样的一个难以回答的话,但这里是表:MySQL查询返回相同的字段引用2个不同的外键

* 学生

ID PK

ASSIGNED_ADVISOR_ID FK REF(DEP_FACULTY .ID)

FNAME

LNAME

* DEP_FACULTY

ID

FNAME

LNAME

* ADVISE_HIST

student_id数据

ACTUAL_ADVIS OR_ID FK REF(DEP_FACULTY.ID)

继承人的问题:

学生可以通过比其他教员被告知他们的ASSIGNED_ADVISOR_ID(这是ACTUAL_ADVISOR_ID),我需要一个查询,连接这些3个表,这将返回一个学生姓名,分配的顾问名称和实际的顾问名称(除其他事项外,我不会列出)。

我的查询到目前为止:

select 
CONCAT(STUDENT.LNAME,', ',STUDENT.FNAME), 
CONCAT(DEP_FACULTY.LNAME,', ',DEP_FACULTY.FNAME) as "ASSIGNED ADVISOR", 
***need a field here for actual advisor*** 
from 
    STUDENT 
    join DEP_FACULTY on STUDENT.ASSIGNED_ADVISOR_ID=DEP_FACULTY.ID 
    left join ADVISE_HIST on STUDENT.ID=ADVISE_HIST.STUDENT_ID; 

有什么办法来显示DEP_FACULTY.LNAMEFNAME了,但引用实际的顾问这个时间呢?

或者是否需要添加冗余到ADVISE_HISTADVISE_HIST.DEP_FACULTY_LNAMEADVISE_HIST.DEP_FACULTY_FNAME)以正确返回此信息?

回答

1
select 
CONCAT(STUDENT.LNAME,', ',STUDENT.FNAME), 
CONCAT(DEP_FACULTY.LNAME,', ',DEP_FACULTY.FNAME) as `ASSIGNED ADVISOR`, 
CONCAT(ACTUAL.LNAME, ', ', ACTUAL.FNAME) AS `ACTUAL ADVISOR` 
from 
    STUDENT 
    join DEP_FACULTY on STUDENT.ASSIGNED_ADVISOR_ID=DEP_FACULTY.ID 
    left join ADVISE_HIST on STUDENT.ID=ADVISE_HIST.STUDENT_ID 
    /* JOIN again between DEP_FACULTY and ADVISE_HIST with an alias */ 
    LEFT JOIN DEP_FACULTY AS ACTUAL ON ADVISE_HIST.ACTUAL_ADVISOR_ID = ACTUAL.ID 
+0

只有它可能应该是左加入。 – 2012-03-11 03:53:49

+0

@AndriyM不确定没有测试 - 因为它是'STUDENT'和'ADVISE_HIST'之间的一个LEFT JOIN,应该已经被处理了。 – 2012-03-11 03:56:00

+0

是的,因为左边没有建议历史记录的学生可以返回,但是使用内部连接,他们将被丢弃,因为您的连接会尝试将NULL ACTUAL_ADVISOR_ID与ACTUAL.ID匹配并失败。 – 2012-03-11 04:03:34

相关问题