Соедините два запроса вместе - PullRequest
2 голосов
/ 25 апреля 2011

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

Student:
    id
    created_on
    updated_on

StudentHistory
    id
    studentid
    schoolid
    gradeid
    datestamp
    active

История студентов управляет изменениями студентов за последние годы и позволяет мне сообщать о росте студентов.

Теперь мне нужно выполнить следующий запрос:

SELECT * FROM students
INNER JOIN studenthistory
    ON student.id = studenthistory.studentid
WHERE studenthistory.active = 1

Проблема в том, что запрос не обязательно будет извлекать последнюю запись истории, как мне нужно.Есть ли способ, которым я могу гарантировать, что в объединении будет извлечена только самая последняя запись истории?

Ответы [ 2 ]

4 голосов
/ 25 апреля 2011
SELECT  *
FROM    students s
JOIN    studentshistory sh
ON      sh.id =
        (
        SELECT  shi.id
        FROM    studentshistory shi
        WHERE   shi.studentid = s.id
                AND shi.active = 1
        ORDER BY
                studentid DESC, active DESC, datestamp DESC, id DESC
        LIMIT 1
        )

Создайте индекс для studentshistory (studentid, active, datestamp, id), чтобы это работало быстро.

0 голосов
/ 25 апреля 2011

Я думаю, что это должно работать:

SELECT * FROM Students
INNER JOIN StudentHistory sh1 
  ON Student.studentid = sh1.studentid 
  AND StudentHistory.datestamp = 
    (SELECT MAX(datestamp) 
     FROM StudentHistory sh2 
     WHERE sh2.studentid = sh1.studentid);
...