#mysql
#mysql
Вопрос:
Мне нужно запросить 3 таблицы, чтобы извлечь среднюю оценку по всем учителям
У меня есть следующие таблицы :
Для студентов
create table students
(id int not null auto_increment,
surname varchar(100) not null,
name varchar(100) not null,
primary key (id),
unique(nume,prenume)
);
УЧИТЕЛЯ
create table teachers(
id int not null auto_increment,
surname varchar(100) not null,
name varchar(100) not null,
primary key (id),
unique(nume,prenume)
);
КАТАЛОГ
create table catalog (
id int not null auto_increment,
`data` datetime not null,
id_teacher int not null,
id_student int not null,
nota int not null,
primary key (id),
FOREIGN KEY (id_teacher) REFERENCES teachers(id),
FOREIGN KEY (id_student) REFERENCES students(id)
);
Мне нужно сделать запрос, из которого будут получены учащиеся со средней степенью> 7,5 для всех учителей.
Я пробовал это, но безрезультатно, и я не понимаю, что не так :
select avg(c.nota) AS 'medie', c.id_student, e.surname, e.name, c.id_teacher, p.surname, p.name from catalog c
left join students e on e.id = c.id_student
left join teachers p on p.id = c.id_teacher
group by c.id_teacher
having avg(c.nota) > 7.5;
Комментарии:
1. У вас есть данные в ваших таблицах? Можете ли вы сообщить некоторые данные в своем вопросе?
2. 1 2013-09-04 07:47:20 1 1 4 2 2017-10-27 08:19:47 2 2 6 3 2017-02-10 12:53:34 3 3 7 4 2018-11-04 06:20:40 4 4 10 5 2014-12-26 08:12:38 5 5 9 6 2017-10-05 06:39:40 6 6 47 2016-03-14 06:28:56 7 7 7 8 2016-03-22 06:41:30 8 8 8 9 2013-10-06 11:16:33 9 9 10 Это данные из каталога — id / data / id_teacher/ id_student/ степень
3. Научитесь правильно использовать
GROUP BY
. Ваше утверждение даже не имеет смысла.
Ответ №1:
С помощью этого запроса:
select s.id, avg(c.nota) medie
from catalog c
inner join students s on s.id = c.student_id
inner join teachers t on t.id = c.teacher_id
group by s.id, t.id
вы получаете идентификаторы всех учащихся со средним значением> 7,5 для каждого преподавателя.
Затем присоединитесь к students
таблице:
select s.id, s.surname, s.name
from students s inner join (
select s.id, avg(c.nota) medie
from catalog c
inner join students s on s.id = c.student_id
inner join teachers t on t.id = c.teacher_id
group by s.id, t.id
) g ON g.id_student = s.id
group by s.id, s.surname, s.name
having min(g.medie) > 7.5
Комментарии:
1. Спасибо forpas за ответ. Требование заключается в использовании 3 таблиц . У одного ученика может быть несколько «medie» для одного учителя или всех учителей. У них должно быть минимальное значение> 7.5 у всех учителей.
2. У одного ученика может быть несколько «средних» значений для одного учителя или всех учителей ? У каждого ученика есть только 1
nota
для учителя?3. у ученика более 1 «примечания» для учителя. И у ученика может быть больше «примечаний» и он может быть предоставлен всем преподавателям.
4. у ученика больше «нот» для учителя , хорошо, но что это значит: у ученика может быть больше «нот» и быть распределенным для всех учителей ?
5. # id_student, id_teacher, примечание ‘9’, ‘9’, ’10’ ‘9’, ’66’, ‘6’ ‘9’, ’67’, ‘9’ ‘9’, ’69’, ’10’ например, тот же студент (id 9) имеет4 учителя, но он не должен быть возвращен в запросе, потому что у него 1 примечание из 6