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。
不幸的是,我卡在了某个点上,无法前进。 让我描述一下问题是什么。
简短描述:我写了一个不断检查服务器状态的系统,结果是 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。