在每个子组中为每个加入的行选择最新的

时间:2020-02-10 15:39:54

标签: mysql join group-by

我有两个表: sessions session_states 。第一个表包含有关会话的一些常规信息。

第二个表包含每个会话的状态历史记录;多个行可以连接到同一会话(列 session_id );带有最新 timestamp 的行表示给定会话的当前/实际状态。

会话

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

会话状态

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的右侧,我们遍历了每一行。

有什么方法可以更有效地做到这一点?

P.S。我只能使用MySQL 5.6 / 5.7。

0 个答案:

没有答案
相关问题