2012-03-11 54 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

相關問題