GROUP BY with MAX(date),但日期在两个单独的列中
GROUP BY with MAX(date), but the date is in two separate columns
我正在尝试获取 table 中每位作者具有最新 posting 日期的所有行的 ID 列表,例如:
id author_id date
1 12 2020-12-23
2 12 2021-01-06
3 12 2021-04-12
4 12 2021-02-10
5 17 2021-09-16
6 17 2021-05-20
7 17 2021-02-23
8 17 2021-07-02
9 24 2021-03-24
10 24 2021-02-10
11 24 2020-08-18
12 24 2020-12-14
期望的结果应该是:
id
3
5
9
我使用了这个查询,它运行良好:
SELECT a.id
FROM (
SELECT author_id, MAX(`date`) as MaxDate
FROM `posts_log`
GROUP BY author_id
) b
INNER JOIN `posts_log` a
ON a.author_id = b.author_id AND a.date = b.MaxDate
但让我们假设情况发生了变化。现在作者每月只能 post 一次。所以 table 也发生了变化, 'date' 列被分开了:
id author_id month year
1 12 12 2020
2 12 1 2021
3 12 4 2021
4 12 2 2021
5 17 9 2021
6 17 5 2021
7 17 2 2021
8 17 7 2021
9 24 3 2021
10 24 2 2021
11 24 8 2020
12 24 12 2020
是的,我知道,看起来有点傻,但这不是我的决定。现在我有这样的 table 并且不允许我更改结构。
问题是:如何使用这个新 table 获得相同的结果。 MySQL可以吗?
你可以使用类似的逻辑。不使用日期,而是使用年和月的计算值:
SELECT a.id
FROM (
SELECT p.author_id, MAX(p.year*100+p.month) as MaxMonth
FROM posts_log p
GROUP BY p.author_id
) b
INNER JOIN posts_log a
ON a.author_id = b.author_id AND a.year*100+a.month = b.MaxMonth;
我正在尝试获取 table 中每位作者具有最新 posting 日期的所有行的 ID 列表,例如:
id author_id date
1 12 2020-12-23
2 12 2021-01-06
3 12 2021-04-12
4 12 2021-02-10
5 17 2021-09-16
6 17 2021-05-20
7 17 2021-02-23
8 17 2021-07-02
9 24 2021-03-24
10 24 2021-02-10
11 24 2020-08-18
12 24 2020-12-14
期望的结果应该是:
id
3
5
9
我使用了这个查询,它运行良好:
SELECT a.id
FROM (
SELECT author_id, MAX(`date`) as MaxDate
FROM `posts_log`
GROUP BY author_id
) b
INNER JOIN `posts_log` a
ON a.author_id = b.author_id AND a.date = b.MaxDate
但让我们假设情况发生了变化。现在作者每月只能 post 一次。所以 table 也发生了变化, 'date' 列被分开了:
id author_id month year
1 12 12 2020
2 12 1 2021
3 12 4 2021
4 12 2 2021
5 17 9 2021
6 17 5 2021
7 17 2 2021
8 17 7 2021
9 24 3 2021
10 24 2 2021
11 24 8 2020
12 24 12 2020
是的,我知道,看起来有点傻,但这不是我的决定。现在我有这样的 table 并且不允许我更改结构。 问题是:如何使用这个新 table 获得相同的结果。 MySQL可以吗?
你可以使用类似的逻辑。不使用日期,而是使用年和月的计算值:
SELECT a.id
FROM (
SELECT p.author_id, MAX(p.year*100+p.month) as MaxMonth
FROM posts_log p
GROUP BY p.author_id
) b
INNER JOIN posts_log a
ON a.author_id = b.author_id AND a.year*100+a.month = b.MaxMonth;