Выберите последнее в каждой подгруппе для каждой объединенной строки - PullRequest
0 голосов
/ 10 февраля 2020

У меня есть две таблицы: сессий и сессий_states . Первая таблица содержит общую информацию о сеансе.

Вторая таблица содержит историю состояний для каждого сеанса; несколько строк могут быть подключены к одному сеансу (столбец session_id ); строка с самой последней отметкой времени представляет текущее / фактическое состояние для данного сеанса.

сеансов

id   search_criteria   some_other_info
1    aaa               something
2    bbb               something
3    aaa               something

session_states

pk   session_id   state   timestamp
1    1            new     01/01/1970 00:01
2    1            active  01/01/1970 00:02
3    2            new     01/01/1970 01:01
4    3            new     01/01/1970 02:01

Я пытаюсь создать запрос, который позволяет сортировать по столбцу search_criteria и представляет список совпадающих сеансов с их текущими состояниями. Примерно так (WHERE search_criteria = 'aaa'):

id   search_criteria   some_other_info   state   timestamp
1    aaa               something         active  01/01/1970 00:02
3    aaa               something         new     01/01/1970 02:01

Мой запрос:

SELECT s.id, s.search_criteria, s.some_other_info, st.state, st.timestamp
FROM sessions s
    JOIN
    (SELECT session_id, state, MAX(timestamp) FROM session_states GROUP BY session_id DESC) st
    ON s.id = st.session_id
WHERE search_criteria = 'aaa';

Когда в каждой таблице 400k + строк, выполнение запроса занимает более 1 секунды. Анализатор запросов говорит, что в правой части JOIN мы пропускаем oop через каждую строку.

Любой способ сделать это более эффективным способом?

PS Я могу использовать только MySQL 5,6 / 5,7.

...