2015-11-17 55 views
1

的情況是這樣的:如何建立連接,並在同一行自加入

  1. Teacher PerformanceStudent Performance實體,所以老師和學生可以參加同一門課程有他們的得分
  2. 教師可以教學生和老師
  3. 有一張Teaching Relation表,並且是老師和學生都可以出現在出席的列中,但只有老師才能出現在老師列中。
  4. 理想的報告表列出了教師的所有表現,以及老師教授的學生和老師的平均表現。

在我們的系統中,id是數字,我只是爲了演示而將它命名爲first name。

教師績效(tb_tp)

t_id  | score 
------------------ 
JOHN  | 5 
ASHLEY | 6 
STEVEN |4.5 

學生表現(tb_sp)

 s_id | score 
------------------ 
SCOTT  | 5 
FRANK  | 8 
TIM  | 7 

教學關係(tb_tr)

t_id (teacher) | a_id for attendance id | a_type attendance type 
------------------------------------------------------------------ 
ASHLEY   | JOHN     | teacher 
ASHLEY   | FRANK     | student 
ASHLEY   | TIM     | student 
JOHN   | ASHLEY     | teacher 
JOHN   | FRANK     | student 

所需的報表:

t_id  | Score| avg_t AVG score from Teacher | avg_s AVG score from Student 
-------------------------------------------------------------------------- 
    ASHLEY | 6 |  (5 from John) /1   | (8 from Frank + 7 from Tim)/2 
-------------------------------------------------------------------------- 
    JOHN  | 5 | (6 from ASHLEY) /1   | (8 from Frank)/1 

我們該如何做到這一點?我想兩個連接在一起或聯合兩個查詢,但無論哪種方式無法保持在同一行上的結果,並準確

+0

你爲什麼使用他們的名字作爲標識符...?這看起來像是一個非常糟糕的數據庫設計 - 如果你有兩個叫Scott的老師,或者一個叫John的老師和一個學生呢? – Siyual

+0

@Siyual我們確實使用id,但只是爲了演示的目的,我把它叫做名字...... – Dreamer

+0

請在問題中使用你的實際結構...使它成爲第一個名字而不是一個ID只是令人困惑。 – Siyual

回答

0

我認爲你想要的技術是兩個外部連接與聚合。這是我未經考驗的通行證:

SELECT p.t_id, p.score, scores.avg_teacher_score, scores.avg_student_score 
FROM teacher_performance p 
JOIN (
    SELECT t_id, AVG(t.score) AS avg_teacher_score, AVG(s.score) AS avg_student_score 
    FROM teaching_relation tr 
    LEFT JOIN teacher_performance t ON t.t_id = tr.a_id AND tr.a_type='teacher' 
    LEFT JOIN student_performance s ON s.s_id = tr.a_id AND tr.a_type='student' 
) scores 
    ON scores.t_id = p.t_id 
+0

非常感謝:) – Dreamer