Q: объединить 2 запроса в 1 - PullRequest
       17

Q: объединить 2 запроса в 1

0 голосов
/ 01 сентября 2018

В настоящее время у меня есть 3 таблицы:

  1. Таблица пользователей

    имя пользователя | имя | фамилия

  2. Таблица курсов

    идентификатор курса | название курса | дата курса | описание курса

  3. Таблица посещаемости

    идентификатор курса | имя пользователя

Таблица пользователей содержит информацию о пользователях. Таблица курсов содержит информацию о курсах. Есть несколько курсов с одинаковым названием, но разной датой. Таблица посещаемости содержит посещаемость пользователей для курса.

Мне дают список имени пользователя и названия курса. Я должен найти имя и фамилию каждого пользователя и самую последнюю дату, когда каждый пользователь прошел курс.

В настоящее время я впервые использую этот запрос, чтобы найти имя и фамилию.

Select firstname, lastname from user where username in (<user list>)

Далее я перебираю результаты предыдущего запроса и беру первый результат следующего запроса:

select date from attendance, course 
where attendance.course_id in (select course_id from course where course_name = <course>) 
and username = <username> and attendance.course_id = course.course_id 
order by course_date desc  

Результатом всего этого является то, что для n пользователей необходимо выполнить n + 1 количество запросов. Я хотел бы свести это к одному запросу, любое предложение?

Спасибо

Ответы [ 2 ]

0 голосов
/ 02 сентября 2018

Вот как я понял вопрос:

select u.firstname, 
       u.lastname, 
       max(c.course_date) max_course_date
from t_attendance a join t_course c on c.course_id = a.course_id
                    join t_user u on c.username = u.username
where a.username in ('user1', 'user2', ...)
  and c.course_name in ('course1', 'course2', ...) 
group by u.firstname, 
         u.lastname;

WHERE предложение может нуждаться в корректировке, в зависимости от того, как вы получаете список имен пользователей и курсов.

0 голосов
/ 01 сентября 2018

Вот мое решение

Select 
  u.firstname
 ,u.lastname
 ,(Select Max(c.course_date) 
   from Attendance a
   join Course c on
   c.course_id = a.course_id
   where
   a.username = u.username
   and c.course_name = <course>
) latest_date
from user u
where u.username in (<user list>);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...