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 无效,因为 select
和 group 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
来对行进行排序。
所以我有这个 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 无效,因为 select
和 group 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
来对行进行排序。