mysql - 为每个连接的行在每个子组中选择最新的
问题描述
我有两个表:session和session_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 的右侧,我们遍历每一行。
有什么方法可以更有效地做到这一点?
PS 我只能使用 MySQL 5.6 / 5.7。
解决方案
推荐阅读
- c# - 是否可以在事件查看器中使用 ETW 登录到子文件夹时使用自定义名称创建事件通道?
- c# - 如何在asp.net web api中将图像路径转换为http url?
- python - TypeError: unhashable type: 'set' in Flask Form 上传文件
- javascript - 如果表单已验证,如何转到另一个 HTML 页面,如果未验证,如何留在同一页面?
- sqlite - “INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL”是否保证是“rowid”的别名?
- python - 在 Seaborn displot 中显示百分比标签
- python - 如何将我的代码转换为 Lists Comprehension?
- kubernetes - 在 kustomization 中从另一个目录引用资源 yaml
- amazon-web-services - 如何使用 AWS CodeDeploy 到 ec2 nginx 文件夹?
- c# - 如何在不同颜色的日历控件中显示数据库存储的多个日期