我有一个数据库,其中包含代表“编辑”到“页面”的表。每个编辑都有一个 ID 和一个时间戳以及一个具有某些离散值的“状态”。页面有 ID,也有“类别”。
我希望找到给定类别中每种状态的页面数,仅考虑最近编辑的状态。
编辑:
+---------+---------+-----------+--------+
| edit_id | page_id | edit_time | status |
+---------+---------+-----------+--------+
| 1 | 10 | 20210502 | 90 |
| 2 | 10 | 20210503 | 91 |
| 3 | 20 | 20210504 | 91 |
| 4 | 30 | 20210504 | 90 |
| 5 | 30 | 20210505 | 92 |
| 6 | 40 | 20210505 | 90 |
| 7 | 50 | 20210503 | 90 |
+---------+---------+-----------+--------+
页数:
+---------+--------+
| page_id | cat_id |
+---------+--------+
| 10 | 100 |
| 20 | 100 |
| 30 | 100 |
| 40 | 200 |
+---------+--------+
我想得到,类别100
:
+--------+-------+
| stat | count |
+--------+-------+
| 90 | 1 |
| 91 | 2 |
| 92 | 1 |
+--------+-------+
页面10
和30
有两个编辑,但后一个“覆盖”第一个,所以只有带有状态91
和的编辑92
被计算在内。页面20
和40
帐户之一91
和90
每个页面50
都属于错误的类别,因此它没有功能。
我尝试了以下方法,但似乎不起作用。这个想法是为每个具有正确类别的页面选择最大(即最新)编辑。然后将其加入编辑表并按状态分组并计算行数:
SELECT stat, COUNT(*)
FROM edits as out_e
INNER JOIN (
SELECT edit_id, page_id, max(edit_time) as last_edit
FROM edits
INNER JOIN pages on edit_page_id = page_id
WHERE cat_id = 100
GROUP BY page_id
) in_e ON out_e.edit_id = in_e.edit_id
GROUP BY stat
ORDER BY stat;
"""
例如在这个小提琴中:http ://sqlfiddle.com/#!9/42f2ed/1
结果是:
+--------+-------+
| stat | count |
+--------+-------+
| 90 | 3 |
| 91 | 1 |
+--------+-------+
获取此信息的正确方法是什么?