SQL: разорвать связь с подзапросом - PullRequest
0 голосов
/ 05 мая 2018

Предположим, у меня есть таблица MySQL signed_up со столбцами student_id, course_id, and marks. Я хочу вернуть student_id, course_id и максимум mark для каждого студента. Если студент получал одинаковые mark на нескольких курсах, я бы хотел взять строку с наименьшим course_id. Наконец, я хотел бы отобразить отсортированные результаты по возрастанию student_id.

Вот моя попытка, которая дает неправильный вывод:

select student_id, course_id, max(grade) from signed_up
where course_id = 
    (select min(course_id) from signed_up s where s.student_id = student_id)
group by student_id, course_id
order by student_id asc;

Я получаю набор результатов, где course_id - это все 1 для начала. Это заставляет меня думать, что я испортил свой подзапрос в предложении where.

Есть предложения?

Ответы [ 2 ]

0 голосов
/ 05 мая 2018

Я считаю, что это то, что вы хотите:

select su.student_id, su.course_id, su.grade
from signed_up su
where (su.course_id, su.grade) = (select su2.course_id, su2.grade
                                  from signed_up su2
                                  where su2.student_id = su.student_id
                                  order by su2.grade desc, su2.course_id
                                 );

Получается максимальная оценка для каждого учащегося вместе с курсом с этой оценкой. Если есть дубликаты, выбирается курс с меньшим идентификатором.

Вы можете также сформулировать это как group by с небольшим количеством взлома:

select su.student_id,
       substring_index(group_concat(su.course_id order by grade desc, course_id asc), ',', 1) as course_id,
       max(su.grade)
from signed_up su
group by su.student_id;
0 голосов
/ 05 мая 2018

Надеюсь, что следующий запрос поможет:

select su.student_id, min(su.course_id), su.grade from signed_up su where
su.grade = (select max(grade) from signed_up s where s.student_id = su.student_id)
group by su.student_id order by su.student_id asc;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...