【问题标题】:(MySQL 5.7) How to combine my two queries?(MySQL 5.7)如何组合我的两个查询?
【发布时间】:2021-04-26 08:32:48
【问题描述】:

如何在 MySQL 5.7 中组合我的两个查询:

(windows功能不工作)

1:此查询查找所有消息超过 10 条且间隔至少一小时的对话。

SELECT `dialog_id`
  FROM `messages`
  GROUP BY `dialog_id`
  HAVING COUNT(*) >= 10 
    AND MIN(`timestamp`) + INTERVAL 1 HOUR < MAX(`timestamp`)

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 条消息。

【问题讨论】:

    标签: mysql sql mysql-5.7


    【解决方案1】:

    虽然我没有正确找到你,但这是你要找的:

        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
    and dialog_id in (SELECT `dialog_id`
      FROM `messages`
      GROUP BY `dialog_id`
      HAVING COUNT(*) >= 10 
        AND MIN(`timestamp`) + INTERVAL 1 HOUR < MAX(`timestamp`))
    
     ORDER BY dialog_id DESC
    

    【讨论】:

    • 感谢您的回答,但我收到一个错误:SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax;检查与您的 MySQL 服务器版本相对应的手册,以在第 3 行的 'where dialog_id in (SELECT dialog_id FROM messages GROUP BY dialog_id HAVING COUNT(*)' 附近使用正确的语法
    • 能否分享一些表结构以及一些示例数据。
    • @JohnDoe 我已经改变了我的答案。请尝试让我知道您的反馈。目前我无法检查 mysql db。
    • 哦,你变魔术了!现在工作正常!非常感谢您,Kazi Mohammad Ali Nur!
    • 感谢您接受我的回答。最良好的祝愿。
    【解决方案2】:

    您可以使用子查询完成此操作的一种方法:

    SELECT *
    FROM messages tbl
    WHERE (
        SELECT COUNT(*)
         messages tbl1
         tbl1.dialog_id = tbl.dialog_id
         tbl1.id >= tbl.id
         (user_from = :user_from OR user_to = :user_to)) <= 2
      and dialog_id in (
        SELECT `dialog_id`
        FROM `messages`
        GROUP BY `dialog_id`
        HAVING COUNT(*) >= 10
           AND MIN(`timestamp`) + INTERVAL 1 HOUR < MAX(`timestamp`))
    ORDER BY dialog_id DESC
    

    您可能需要稍微调整一下,因为我没有您的表格的完整结构,但原则如下:获取所有符合您的 10 小时和一个多小时标准的对话 ID,然后使用它来限制从“获取最近的两个”逻辑返回的消息。

    【讨论】:

    • Aeron,感谢您的回答和编辑我的帖子。但我得到了同样的错误。感谢您的回答,但我收到一个错误:SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax;检查与您的 MySQL 服务器版本相对应的手册以获取正确的语法,以便在第 3 行的“where dialog_id in (SELECT dialog_id FROM messages GROUP BY dialog_id HAVING COUNT(*)”附近使用正确的语法
    • 那么这个问题可能会比我在没有看到你的结构的情况下假设的要微妙一些。另外:您显示的错误没有出现在我发布的任何代码中,所以我很想知道您是否尝试过我发布的代码,因为它似乎来自另一个发布的答案:/
    • 是的,我当然试过了,我就是不能错过。反正现在已经解决了。不过还是谢谢你
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-07
    • 2018-08-08
    • 2015-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多