MySQL 日志 Table 获取更改数据的查询

MySQL Logs Table Query to fetch changed data

不幸的是,我卡在了某个点上,无法前进。 让我描述一下问题是什么。

简短描述:我写了一个不断检查服务器状态的系统,结果是 1 或 0(true 或 false)。这些状态正在写入名为 "logs" 的数据库 table。有多个受监控的系统。现在我想要实现的是从数据库中获取每个系统的状态变化列表。 (仅当状态发生变化,例如从在线变为离线)所有数据周期。

结构:

Table [logs] -
logs.logs_id == mon.mon_id
logs.logs_status 
logs.logs_updated

Table [monitoring] -
mon.mon_id
mon.mon_sid
mon.....

示例数据 -

logs.logs_id | logs.logs_status | logs.logs_updated
1    1    2020/02/29 21:04:00
2    1    2020/02/29 21:04:00
3    1    2020/02/29 21:04:00
4    1    2020/02/29 21:04:00
5    1    2020/02/29 21:04:00
6    0    2020/02/29 21:04:00
1    1    2020/02/29 21:04:10
2    1    2020/02/29 21:04:10
3    1    2020/02/29 21:04:10
4    1    2020/02/29 21:04:10
5    1    2020/02/29 21:04:10
6    0    2020/02/29 21:04:10
1    1    2020/02/29 21:04:20
2    1    2020/02/29 21:04:20
3    1    2020/02/29 21:04:20
4    1    2020/02/29 21:04:20
5    1    2020/02/29 21:04:20
6    0    2020/02/29 21:04:20
1    1    2020/02/29 21:04:30
2    1    2020/02/29 21:04:30
3    1    2020/02/29 21:04:30
4    1    2020/02/29 21:04:30
5    1    2020/02/29 21:04:30
6    1    2020/02/29 21:04:30
1    1    2020/02/29 21:04:40
2    1    2020/02/29 21:04:40
3    1    2020/02/29 21:04:40
4    1    2020/02/29 21:04:40
5    1    2020/02/29 21:04:40
6    1    2020/02/29 21:04:40
1    1    2020/02/29 21:04:50
2    1    2020/02/29 21:04:50
3    1    2020/02/29 21:04:50
4    1    2020/02/29 21:04:50
5    1    2020/02/29 21:04:50
6    0    2020/02/29 21:04:50
1    1    2020/02/29 21:05:00
2    1    2020/02/29 21:05:00
3    1    2020/02/29 21:05:00
4    1    2020/02/29 21:05:00
5    0    2020/02/29 21:05:00
6    0    2020/02/29 21:05:00

基于上面的示例数据,我想创建 SQL 查询(MySQL 数据库)将显示以下结果 -

mon.mon_sid | logs.logs_status | logs.logs_updated
YYY        0    2020/02/29 21:05:00
XXX        0    2020/02/29 21:04:50
XXX        1    2020/02/29 21:04:30
XXX        0    2020/02/29 21:04:00

因为只有 log.mon_id == 6 和 log.mon_id == 5 的状态根据数据改变了,所以只应该返回这个。所以我将有四行结果。

提前感谢您的帮助,我已经筋疲力尽了。 你好,迈克尔。

如果你是运行 MySQL 8.0,你可以直接使用lag():

select *
from (
    select 
        l.*,
        lag(logs_status) over(
            partition by logs_id 
            order by logs_updated
        ) lag_log_status
    from logs l
) t
where log_status <> lag_log_status
select 
    mon.mon_sid,
    mon.mon_hostname,
    mon.mon_port,
    mon.mon_display,
    logs_status AS current_status,
    previous_status,
    logs_updated
from (
    select 
        l.*,
        lag(logs_status) over(
            partition by mon_id
            order by logs_updated
        ) previous_status
    from logs l
) tmp
    INNER JOIN monitoring AS mon
    ON tmp.mon_id = mon.mon_id
where logs_status <> previous_status
ORDER BY logs_updated DESC

这是基于@GMB解决方案的最终版本,再次感谢@GMB。