MySQL记录表查询以获取更改的数据
不幸的是,我被困在某个点上,无法前进。 让我描述一下问题是什么 简短描述:我写了一个系统,不断检查服务器的状态,结果是1或0真的假。这些状态正在写入名为logs的数据库表中。有多个受监控的系统。现在我想要实现的是从数据库中获取每个系统的状态更改列表。仅当ex.的状态更改时,在所有数据期间从联机变为脱机 结构: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
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