首页 > 解决方案 > 过滤mysql中的行

问题描述

我正在尝试解决 MySQL 问题而不会发疯。不确定是否可行。数据来自门/光传感器,以检测厕所是否被占用。当门关闭或打开时,我得到信息+灯光信息。如果我有关门和灯<10的信息,我说厕所没有被占用,如果灯>10,厕所被占用,如果门打开,厕所未被占用。

这是我的数据示例:

id   wc_id   door_open  light      time
138     0         1     64     2018-10-10 12:28:51
139     0         0     58     2018-10-10 12:34:00
140     0         0     54     2018-10-10 12:34:38
141     0         1     68     2018-10-10 12:35:11
142     0         1     3      2018-10-10 12:35:36
143     0         0     60     2018-10-10 12:37:56
144     0         0     60     2018-10-10 12:37:57
145     0         0     57     2018-10-10 12:38:30
146     0         1     65     2018-10-10 12:43:53
147     0         1     3      2018-10-10 12:44:17
148     0         0     63     2018-10-10 13:10:55
149     0         0     59     2018-10-10 13:11:16
150     0         1     71     2018-10-10 13:12:09
151     0         1     4      2018-10-10 13:12:14
152     0         1     1      2018-10-10 13:15:07
153     0         0     62     2018-10-10 13:17:18
154     0         0     58     2018-10-10 13:18:01
155     0         1     68     2018-10-10 13:19:20
156     0         1     3      2018-10-10 13:19:56
157     0         1     42     2018-10-10 13:26:41
158     0         0     63     2018-10-10 13:26:44
159     0         0     58     2018-10-10 13:27:39
160     0         1     71     2018-10-10 13:27:40
161     0         1     3      2018-10-10 13:28:37

最后的想法是只有一系列的 door_open 到 0 到 1,不可能有两个 0 或两个 1 连续。所以我需要首先door_open=0遵循light>10a door_open=1,然后首先遵循door_open=1door_open=0无论是什么光值。

MySQL可以吗?我使用 MariaDB 10.3.9。

谢谢你的想法。

输出应该是这样的:

id   wc_id   door_open  light      time
139     0         0     58       12:34:00
141     0         1     68       12:35:11
143     0         0     60       12:37:56
146     0         1     65       12:43:53
148     0         0     63       13:10:55
150     0         1     71       13:12:09
153     0         0     62       13:17:18
155     0         1     68       13:19:20
158     0         0     63       13:26:44
160     0         1     71       13:27:40

(我简化了时间,这里并不重要)这是一个小提琴

标签: mysqlmariadb

解决方案


这个查询应该做你想做的事。它使用一个 MySQL 变量将 的值延迟door_open1 行,然后返回door_open=0带有light>10跟随 adoor_open=1和 first door_open=1after的行door_open=0,无论轻值:

SELECT events.*, @door_open := door_open
FROM events
JOIN (SELECT @door_open := 1) do
WHERE @door_open = 0 AND door_open = 1 OR
      @door_open = 1 AND door_open = 0 AND light > 10

输出(来自您的小提琴数据):

id      toilet_id   door_open   light   time                    @door_open := door_open
101     0           false       62      2018-10-10T11:39:31Z    0
103     0           true        69      2018-10-10T11:39:34Z    1
104     0           false       62      2018-10-10T11:42:16Z    0
106     0           true        68      2018-10-10T11:45:50Z    1
109     0           false       56      2018-10-10T12:13:11Z    0

更新了 SQLFiddle


推荐阅读