2015-11-17 2 views
1

Ситуация такова:Как установить присоединиться и автообъединение в той же строке

  1. Существует Teacher Performance и Student Performance сущность, поэтому учитель и ученик может посещать тот же курс есть их оценка
  2. Учитель может научить студент и преподаватель
  3. Существует таблица Teaching Relation, и оба преподавателя и ученика могут появиться в колонке посещаемости, но только учитель может появиться в колонке учителя.
  4. В таблице требуемого отчета перечислены все показатели работы преподавателя, а также средняя производительность учащихся и преподавателей, преподаваемых преподавателем.

В нашей системе id является числовым, я сделал его первым именем только для демонстрационной цели.

Учитель Performance (tb_tp)

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

Student Performance (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

Почему вы используете свое имя в качестве идентификатора ...? Это похоже на очень плохой дизайн базы данных - что, если бы у вас было два учителя по имени Скотт, или учитель и студент по имени Джон? – Siyual

+0

@Siyual мы используем id, но только для демонстрационной цели я делаю это имя ... – Dreamer

+0

Пожалуйста, используйте свою фактическую структуру в вопросе, тогда ... Сделать это имя вместо идентификатора просто сбивает с толку. – 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

Смежные вопросы