在MySQL数据库中选择时间线

问题描述 投票:0回答:1

这是我的MySQL表。

+-----------+-------------+---------------------+
|   element | status      | hour                |
+-----------+-------------+---------------------+
|        18 | Available   | 2020-01-19 14:23:49 |
|        18 | Unavailable | 2019-09-13 18:19:47 |
|        18 | Available   | 2019-09-13 18:18:49 |
|        18 | Unavailable | 2019-09-09 08:22:45 |
|        19 | Available   | 2019-09-07 19:13:56 |
|        19 | Available   | 2019-09-03 18:13:49 |
+-----------+-------------+---------------------+

通常,此MySQL表中每个元素status的行的时间轴不可用/可用。

但是碰巧对于元素编号19,status中行的时间轴可用/可用:

+----------+-------------+---------------------+
| element  | status      | hour                |
+----------+-------------+---------------------+
|       19 | Available   | 2019-09-07 19:13:56 |
|       19 | Available   | 2019-09-03 18:13:49 |
+----------+-------------+---------------------+

这意味着异常。

我需要截取这些情况,即时间轴可用/可用时每个元素status的所有行。

如何解决此问题?

请您能帮我吗?

#Edit 01

+-----------+-------------+---------------------+---------+
|   element | status      | hour                |   ID    |
+-----------+-------------+---------------------+---------+
|        18 | Available   | 2020-01-19 14:23:49 |   6     |
|        18 | Unavailable | 2019-09-13 18:19:47 |   5     |
|        18 | Available   | 2019-09-13 18:18:49 |   4     |
|        18 | Unavailable | 2019-09-09 08:22:45 |   3     |
|        19 | Available   | 2019-09-07 19:13:56 |   2     |
|        19 | Available   | 2019-09-03 18:13:49 |   1     |
+-----------+-------------+---------------------+---------+
mysql timeline mysql-5.5
1个回答
1
投票

根据您最初发布的样本数据,您可以使用子查询查看下一个和上一个状态,然后进行测试

select s.element,s.hour,s.`status`
from
(
select t.*,
(select concat(t1.status,',',t1.hour) from t t1 
where t1.element = t.element and t1.hour < t.hour
order by t1.element,t1.hour desc limit 1) prev,
(select concat(t1.status,',',t1.hour) from t t1 
where t1.element = t.element and t1.hour > t.hour
order by t1.element,t1.hour limit 1) nxt
from t
) s
where s.status = substring_index(s.nxt,',',1) or
        s.status = substring_index(s.prev,',',1)
;
© www.soinside.com 2019 - 2024. All rights reserved.