MySql 分组依据和按日期排序
MySql Group By and order by date
这是我的 table 数据:
id page_id time created
=======================================================
1 1 00:15:00 2020-11-05 09:55:54
2 1 00:25:00 2020-11-10 07:35:24
3 2 00:10:25 2020-11-06 06:15:20
这里是 MySql 查询:
SELECT
a.* SUM (a.time) AS time
FROM
`activity` AS a
GROUP BY a.page_id
ORDER BY a.created DESC;
期望的结果是让最新的记录显示在最上面,但是我却让第一条记录显示在最上面;
喜欢:
2 1 00:25:00 2020-11-10 07:35:24
3 2 00:10:25 2020-11-06 06:15:20
相反,我得到了这个:
1 1 00:15:00 2020-11-05 09:55:54
3 2 00:10:25 2020-11-06 06:15:20
您似乎需要 id
的最新记录,如 created
所定义。如果是这样,您需要过滤而不是聚合。
在 MySQL 8.0 中,我建议使用 window 函数:
select *
from (
select a.*,
rank() over(partition by page_id order by created desc) rn
from activity a
) a
where rn = 1
order by created desc
在早期版本中,您可以使用相关子查询进行过滤:
select a.*
from activity a
where a.created = (
select max(a1.created) from activity a1 where a1.page_id = a.page_id
)
这是我的 table 数据:
id page_id time created
=======================================================
1 1 00:15:00 2020-11-05 09:55:54
2 1 00:25:00 2020-11-10 07:35:24
3 2 00:10:25 2020-11-06 06:15:20
这里是 MySql 查询:
SELECT
a.* SUM (a.time) AS time
FROM
`activity` AS a
GROUP BY a.page_id
ORDER BY a.created DESC;
期望的结果是让最新的记录显示在最上面,但是我却让第一条记录显示在最上面;
喜欢:
2 1 00:25:00 2020-11-10 07:35:24
3 2 00:10:25 2020-11-06 06:15:20
相反,我得到了这个:
1 1 00:15:00 2020-11-05 09:55:54
3 2 00:10:25 2020-11-06 06:15:20
您似乎需要 id
的最新记录,如 created
所定义。如果是这样,您需要过滤而不是聚合。
在 MySQL 8.0 中,我建议使用 window 函数:
select *
from (
select a.*,
rank() over(partition by page_id order by created desc) rn
from activity a
) a
where rn = 1
order by created desc
在早期版本中,您可以使用相关子查询进行过滤:
select a.*
from activity a
where a.created = (
select max(a1.created) from activity a1 where a1.page_id = a.page_id
)