【问题标题】:Performed MSQL query with group by / order by使用 group by / order by 执行 MSQL 查询
【发布时间】:2018-02-07 04:34:03
【问题描述】:

我正在处理个人收件箱。这是我的收件箱表:

收件箱

email -- createdDate -- message

mail1@test.com -- 12/02/2017 -- message1
mail1@test.com -- 13/02/2017 -- message2
mail3@test.com -- 14/02/2017 -- message3
mail2@test.com -- 10/02/2017 -- message4
mail2@test.com -- 05/02/2017 -- message5
mail3@test.com -- 11/02/2017 -- message6
mail3@test.com -- 16/02/2017 -- message7

查询后我想要什么:

email -- createdDate -- message
mail3@test.com -- 16/02/2017 -- message7
mail1@test.com -- 13/02/2017 -- message2
mail2@test.com -- 10/02/2017 -- message4

我已经尝试了一些使用 group by 和 order by 以及 left join 的方法,但是执行起来需要很多时间。

我目前的查询是:

SELECT a.email, a.createdDate, a.message FROM inbox a LEFT JOIN inbox b ON (a.email = b.email AND a.createdDate < b.createdDate)WHERE b.createdDate IS NULL ORDER BY a.createdDate DESC LIMIT 0,20

我已经在我的电子邮件和 createdDate 字段上创建了索引。 你能帮我通过执行 mysql 查询得到这个结果吗? 非常感谢..

【问题讨论】:

  • 关于性能的问题应该包括SHOW CREATE TABLE [table]EXPLAIN [query]
  • 您想要最新的电子邮件信息吗?
  • 是每封邮件的最新消息
  • 如果您在同一日期有两条来自同一来源的消息会怎样?您需要消息的时间以及获取最新消息的日期。
  • 其实不是这里的问题。我的 createdDate 是一个时间戳

标签: mysql


【解决方案1】:

首先对您的子查询进行排序,然后仅对group by 选定的列进行排序:

select * from (select email, STR_TO_DATE(createdDate, '%d/%m/%Y') as myDate, message from inbox order by myDate desc) as t
 group by email

如果同一日期可能有多个电子邮件,您的表中应该有一个id 列(我假设是),那么您需要按顺序添加id DESC

select * from (select email, STR_TO_DATE(createdDate, '%d/%m/%Y') as myDate, message from inbox order by myDate desc, id desc) as t
 group by email

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-31
    • 2021-11-17
    • 2017-02-11
    • 2019-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多