我有一个表,由驱动程序记录在硬件上发生的事件填充,当客户端应用程序执行特殊程序(比如manteinance)时,在此操作期间保存的事件是由用户而不是I / O(传感器和东西),处理这个,因为我需要保存所有可能的事件(通过正常操作或用户操作发生)。 我需要能够过滤那些“维护模式”数据并获取自动生成的信息,为了做到这一点,我在硬件填充的表中插入“START”和“END”行,儿子我可以知道什么时候非功能性数据开始及结束的地方,如下所示:
id | fieldlist...
---+--------------------
1 | event1
2 | event2
3 | event3
4 | manteinance start (inserted by me)
5 | event_by_technician1
6 | event_by_technician2
7 | event_by_technician3
8 | manteinance finish (inserted by me)
9 | event4
10| event5
11| manteinance start (inserted by me)
12| event_by_technicianx
13| event_by_techniciany
14| manteinance finish (inserted by me)
15| eventA
16| manteinance start (inserted by me)
17| event_by_technician
18| manteinance finish (inserted by me)
19| many many more records and start/finish pairs...
我需要过滤所有那些event_by_technician *并只获取事件*行,有没有办法查询信息干净简单,对于可变和非均匀的范围集?
由于
编辑:我想我不清楚,有两个应用程序在服务器上运行,我的基于PHP的Web应用程序和外部驱动程序。两个脚本/应用程序都访问同一个数据库,驱动程序从传感器插入数据和其他硬件状态,并且Web应用程序读取并显示一些非常漂亮的图形(它在用户请求上插入“信令”行,即点击一个按钮)。通过比较来确定一个事件是来自manteinance还是来自正常操作是不可能的,因为它们是相同的,如果技术人员点击网页上的一个按钮开始,另一个完成后,它们的区别是什么。 我需要的是问Mysql:“嘿,只要给我一行不是在一行之间的行,其中field1 = 1(开始),另一行则是field1 = 2(结束)。考虑到结果中有很多开始/结束对我认为我正在采用php重构表的方式,在循环结果集的开始/结束行之间为数据添加一个额外的列。然后提出我的疑问。
答案 0 :(得分:0)
你可以使用LIKE和'?'替换一个字符。例如:
SELECT * FROM table WHERE fieldlist LIKE 'event?'
答案 1 :(得分:0)
使用用户定义的函数应该是最有效的方法。你可以这样做:
SELECT id, event FROM (
SELECT id, event,
@manteinance := (@manteinance_started OR @manteinance) AND event != 'manteinance finish' m,
@manteinance_started := event = 'manteinance start' ms
FROM t, (SELECT @manteinance := FALSE, @manteinance_started := FALSE) init
HAVING m = 0
ORDER BY id
) s
WHERE event NOT IN ('manteinance start', 'manteinance finish')
<强>输出:强>
| ID | EVENT |
|----|--------------------------------------------------|
| 1 | event1 |
| 2 | event2 |
| 3 | event3 |
| 9 | event4 |
| 10 | event5 |
| 15 | eventA |
| 19 | many many more records and start/finish pairs... |
小提琴here。