mysql - 如何组合两个查询?MySQL
问题描述
我怎样才能结合我的两个查询?
1:
SELECT `dialog_id`
FROM `messages`
GROUP BY `dialog_id`
HAVING COUNT(*) >= 10
AND MIN(`timestamp`) + INTERVAL 1 HOUR < MAX(`timestamp`)
此查询正在查找超过 10 条消息且持续时间超过一个小时的对话框。
2:
SELECT * FROM messages tbl WHERE
(SELECT COUNT(*) FROM messages tbl1 WHERE tbl1.dialog_id = tbl.dialog_id AND tbl1.id >= tbl.id AND
(user_from = :user_from OR user_to = :user_to)) <= 2 ORDER BY dialog_id DESC
第二个查询为每个对话框选择最后两行。
所以,我想要的是为每个持续一个多小时且超过 10 条消息的对话框选择最后两行。我想在对话框预览页面上显示它们。
对不起,我的英语不是我的母语。
解决方案
您可以对所有这些计算使用窗口函数:
SELECT m.*
FROM (SELECT m.*,
ROW_NUMBER() OVER (PARTITION BY dialog_id ORDER BY id DESC) as seqnum,
COUNT(*) OVER (PARTITION BY dialog_id) as cnt,
MIN(timestamp) OVER (PARTITION BY dialog_id) as min_timestamp,
MAX(timestamp) OVER (PARTITION BY dialog_id) as max_timestamp
FROM messages m
) m
WHERE seqnum <= 2 AND
cnt >= 10 AND
max_timestamp > min_timestamp + INTERVAL 1 HOUR;
推荐阅读
- dart - 如何使文本小部件将长文本包装成多行?
- javascript - Listview刷新不适用于动态
- php - Laravel 外部的 UrlGenerator
- javascript - 在其他计算属性中使用 Vuex getter
- mysql - 带有 nginx 服务器和 AWS RDS 的 Laravel 出现“连接太多”错误
- rust - 插入式编译器替换找不到 std crate
- c++ - 本地 QEventLoop 是如何工作的
- matlab - Psychtoolbox DrawText 导致很多错过的翻转(Matlab)
- r - Sys.time() 和 format() 在 R 中的桌面和 docker 图像上显示不同的结果
- angular - Angular 中可重用的自定义组件列表