MySQL选择排除几个范围

MySQL选择排除几个范围,mysql,Mysql,我有一个由记录硬件上发生的事件的驱动程序填充的表,当客户端应用程序正在执行一个特殊过程(比如manteinance)时,在这个操作期间保存的事件是由于用户而不是由I/O(传感器和东西)来处理的,因为我需要保存所有可能的事件(无论是正常操作还是用户操作)。 我需要能够过滤那些“维护模式”数据并获得自动生成的信息,为此,我在硬件填充的表中插入“开始”和“结束”行,我可以知道非功能数据何时开始以及在何处结束,如下所示: id | fieldlist... ---+------------------

我有一个由记录硬件上发生的事件的驱动程序填充的表,当客户端应用程序正在执行一个特殊过程(比如manteinance)时,在这个操作期间保存的事件是由于用户而不是由I/O(传感器和东西)来处理的,因为我需要保存所有可能的事件(无论是正常操作还是用户操作)。 我需要能够过滤那些“维护模式”数据并获得自动生成的信息,为此,我在硬件填充的表中插入“开始”和“结束”行,我可以知道非功能数据何时开始以及在何处结束,如下所示:

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...
我需要按技术人员*筛选所有这些事件,并仅获取事件*行,是否有一种方法可以轻松、干净地查询可变和非统一范围的信息

谢谢

编辑:我想我还不清楚,服务器上运行着两个应用程序,我的基于php的web应用程序和一个外部驱动程序。两个脚本/应用程序访问同一个数据库,驱动程序插入来自传感器和其他硬件状态的数据,web应用程序读取这些数据并显示一些非常漂亮的图形(它在用户请求上插入“信号”行,即单击按钮)。无法通过比较确定事件是从尾声还是从正常操作,因为它们完全相同,区别在于技术人员单击网页上的按钮开始,以及在完成时单击另一个按钮。 我需要的是询问Mysql:“嘿,给我那些不在field1=1(开始)的行和field1=2(结束)的行之间的行


我想我正在采用php重构表的方式,在围绕结果集循环的开始行/结束行之间的数据中添加一个额外的列,然后进行查询。

您可以使用LIKE和“?”替换一个字符。例如:

SELECT * FROM table WHERE  fieldlist LIKE 'event?'

使用用户定义的函数应该是最有效的方法。您可以这样做:

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... |

Fiddle.

不要这样做,这会使过滤变得更加困难。添加一个名为
maintenance\u event
的列,默认为false,并在所有维护事件中将其设置为true。那么过滤就很简单了。那么,您的预期输出是什么呢?问题是,我不会插入数据,运行的单独驱动程序会在不知道何时插入数据的情况下插入数据n事件是由于维护或操作,我(php)只知道用户在将手放在硬件上之前何时启动应用程序,以及何时完成(通过在应用程序上结束操作),这就是为什么我要这样做。我的其他想法是使用php返回结果,并反复重新格式化数据(例如,如您所说设置字段),但这似乎有点混乱。@MostyMostacho预期的输出将是:1 | event1 2 | event2 3 | event3 9 | event4 10 | event5 15 | eventA 19 |许多没有开始/结束对或它们之间的记录……这也将返回
eventA
,而OP似乎并不期望event 1的使用,event2、eventA、eventZ、event99999是任意的,表示这是一个由正常操作引起的事件,以及由操作引起的事件,但两者在结构和形式上都是相同的,你只是无法判断一个记录是由一个还是另一个引起的,只有开始和结束的时间戳。它们不是一般的字符串,诸如此类这对purposse不起作用。谢谢你的回答