MySQL记录表查询以获取更改的数据

MySQL记录表查询以获取更改的数据,mysql,sql,gaps-and-islands,Mysql,Sql,Gaps And Islands,不幸的是,我被困在某个点上,无法前进。 让我描述一下问题是什么 简短描述:我写了一个系统,不断检查服务器的状态,结果是1或0真的假。这些状态正在写入名为logs的数据库表中。有多个受监控的系统。现在我想要实现的是从数据库中获取每个系统的状态更改列表。仅当ex.的状态更改时,在所有数据期间从联机变为脱机 结构: Table [logs] - logs.logs_id == mon.mon_id logs.logs_status logs.logs_updated Table [monitori

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

简短描述:我写了一个系统,不断检查服务器的状态,结果是1或0真的假。这些状态正在写入名为logs的数据库表中。有多个受监控的系统。现在我想要实现的是从数据库中获取每个系统的状态更改列表。仅当ex.的状态更改时,在所有数据期间从联机变为脱机

结构:

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的状态,因此只应返回此状态。因此,我将有四行结果

提前谢谢你的帮助,我想弄清楚这件事已经筋疲力尽了。
欢迎您,Michael。

如果您正在运行MySQL 8.0,您可以使用lag:


如果您运行的是MySQL 8.0,您可以使用lag:

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


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

您正在运行哪个版本的MySQL?您好@GMB,谢谢您的回答。它的版本是8.0.19。我现在正在检查你的答案。嗨,哈夫兹,一定要使用这张表上的索引。如果您使用partitionby,那么应该在索引中包含用于分区的列,以便更快地查找。嗨,孩子们,我的印象很深,但GMB提出的解决方案实际上满足了我的期望,可以满足我想要实现的目标。关于您的建议@DwightKendall,感谢您指出性能观点。我不是100%确定你的话在实践中如何实现。表有4列。日志\u快照mon\u id日志\u状态日志\u更新以上任何一项都不是主键或索引。您是否建议还添加带有主键的索引列,主键的唯一性将随着每行的增加而增加?此表将包含大量数据。所以我需要考虑你的建议。非常感谢@GMB提供的解决方案。这里是测试屏幕,德怀特肯德尔,如果你愿意解释更多,我也会非常感激。我可能很快就会很重要了。你在运行哪个版本的MySQL?嗨@GMB,谢谢你的回答。它的版本是8.0.19。我现在正在检查你的答案。嗨,哈夫兹,一定要使用这张表上的索引。如果您使用partitionby,那么应该在索引中包含用于分区的列,以便更快地查找。嗨,孩子们,我的印象很深,但GMB提出的解决方案实际上满足了我的期望,可以满足我想要实现的目标。关于您的建议@DwightKendall,感谢您指出性能观点。我不是100%确定你的话在实践中如何实现。表有4列。日志\u快照mon\u id日志\u状态日志\u更新以上任何一项都不是主键或索引。您是否建议还添加带有主键的索引列,主键的唯一性将随着每行的增加而增加?此表将包含大量数据。所以我需要考虑你的建议。非常感谢@GMB提供的解决方案。这里是测试屏幕,德怀特肯德尔,如果你愿意解释更多,我也会非常感激。我可能很快就会成为重要人物。
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