select MAX() 未显示预期结果

select with MAX() not showing expected result

所以我有这个 table。

 id     header_id   message_from           message         message_date            attachment
    1   0920-0001   USR-0920-0001   MESSAGE ID 1    18/09/2020 04:11    
    3   0920-0001   USR-0920-0001                   18/09/2020 11:15    862db13b42d569b4afe69828736f4ad8.jpg
    4   0920-0001   USR-0920-0001   MESSAGE ID 4    18/09/2020 11:16    
    5   0920-0001   ADMIN           MESSAGE ID 5    18/09/2020 11:16    
    6   0920-0001   ADMIN           MESSAGE ID 6    18/09/2020 11:16    
    7   0920-0002   USR-0920-0001     Hi            18/09/2020 11:52    

我想达到这个结果

    id  header_id   message_from    message         message_date      attachment
     6  0920-0001   ADMIN           MESSAGE ID 6    18/09/2020 11:16    
     7  0920-0002   USR-0920-0001   Hi              18/09/2020 11:52    

我正在尝试使用此查询

SELECT max(id) id , header_id,message from tbl_detail group by header_id

但是结果是这样的

id  header_id   message_from    message         message_date      attachment
 6  0920-0001   ADMIN           MESSAGE ID 1    18/09/2020 11:16    
 7  0920-0002   USR-0920-0001   Hi              18/09/2020 11:52    

我错过了什么吗?提前致谢

您的查询开头的标准 SQL 无效,因为 selectgroup by 子句不一致。 MySQL 容忍这种情况,但不会按照您的意图进行(您实际上得到了列 message 的任意值)。

您想要 header_id 的最新消息:不要考虑 聚合 - 请考虑 过滤

select d.*
from tbl_detail d
where d.id = (select max(d1.id) from tbl_detail d1 where d1.header_id = d.header_id)

为了性能,考虑在 (header_id, id desc) 上建立索引。

如果你是运行 MySQL 8.0,这也可以用window函数来完成:

select d.*
from (
    select d.*, row_number() over(partition by header_id order by id desc) rn
    from tbl_detail d
) d
where rn = 1

根据您的实际需要,您可能希望使用列 message_date 而不是 id 来对行进行排序。