首页 > 解决方案 > 如何组合两个查询?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 条消息的对话框选择最后两行。我想在对话框预览页面上显示它们。

对不起,我的英语不是我的母语。

标签: mysqlsql

解决方案


您可以对所有这些计算使用窗口函数:

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;

推荐阅读