MySQL:如果下一行不符合预期,则选择SELECT

时间:2010-07-16 03:44:40

标签: mysql

所以我有一个日志表。行基本上是这样的:

id  function
n   init()
n+1 check()
n+2 done()
... repeat

但是有这样的问题:

id  function
n   init()
n+1 check()
n+2 done()
n+3 check() <-- should be init!
n+4 done()

如何找到仅在init-&gt; check-&gt; done-&gt; check-&gt;完成传染性订单时发生的行?基本上在行done()之后,它必须再次check()才能被选中。

有没有办法在1(或最小)查询中执行此操作? 性能不是问题。

2 个答案:

答案 0 :(得分:3)

 SELECT line2.*
   FROM log line2
        JOIN log line1
        ON line2.id = line1.id + 1
  WHERE line1.function = 'done()'
    AND line2.function = 'check()'

我知道你说表现不是问题,但仍然;)

答案 1 :(得分:1)

使用:

SELECT l.*
   FROM LOG l
  WHERE l.function = 'check()'
      AND EXISTS(SELECT NULL
                           FROM LOG t
                          WHERE t.function = 'done()'
                               AND t.id = l.id-1)

...获取在done()之后的check()行,并且看起来应该是“init()”。