Php MySQL:选择后跟特定行的行

Php MySQL:选择后跟特定行的行,php,mysql,select,Php,Mysql,Select,只有在以下示例表中有两个值为110的后续和连接事件,且所有事件都具有相同的类别时,如何选择值为105的事件id 通过连接值为110的事件,我指的是在相同类别的110个事件之间不存在106或112等其他事件的情况 id category event 8 100 110 12 100 105 19 101 112 22 100 106 31 100 11

只有在以下示例表中有两个值为110的后续和连接事件,且所有事件都具有相同的类别时,如何选择值为105的事件id

通过连接值为110的事件,我指的是在相同类别的110个事件之间不存在106或112等其他事件的情况

 id     category    event
  8     100         110
 12     100         105
 19     101         112
 22     100         106
 31     100         110
 42     101         106
 121    100         110
 254    100         104
在上面的示例中,id 12将返回到连接110事件的行31和121之前的105事件,因为它们之间没有任何其他事件,并且所有都在同一类别100中

只要查询有效,它的效率如何,或者应该组合多少查询并不重要

更新:
表达这个问题的简单方法是:返回所有105,对于这些105,同一类别中至少存在两个后续相邻的110如果我理解正确,您希望事件为105的行和两个id较大的行的事件等于110。如果是:

select t.*
from sample t
where t.event = 105 and
      (select count(*)
       from sample t2
       where t2.category = t.category and
             t2.id > t.category and
             t2.category = 110
      ) = 2;
编辑:

我想你可以用group_concat做你想做的事:


然后,您可以返回以获取事件为105的详细信息。

在MySQL中,由于缺少分析函数LAG和LEAD,这有点笨拙

select distinct e105.id
from events e105
join
(
  -- all 110 that are directly followed by  a110
  select just_before.id, just_before.category
  from
  (
    -- all 110 and their direct predecessor
    select events.id, min(before.id) as just_before_id
    from events
    left join events before on before.category = events.category and before.id < events.id
    where events.event = 110
    group by events.id
  ) event110
  join events just_before on just_before.id = event110.just_before_id and just_before.event = 110
) e110 on e110.category = e105.category and e110.id > e105.id
where events.event = 105
and not exists
(
  -- a later occuring 105 still bevor the 110 pair
  select *
  from events bad105
  where bad105.category = e105.category and bad105.id > e105.id and bad105.id < e110.id
);
编辑1:我刚刚注意到,您可能需要对案例105-110-110-112-110-110进行区分。两个110对将导致两次发现相同的105。出于这个原因,我在上面添加了DISTICT。我还为要选择的ID添加了限定符e105,因为它丢失了

编辑2:我也注意到你不需要不存在,只需要获得最新的105。由于您已经有了所有105名候选人,因此只需汇总:

select distinct max(e105.id)
from events e105
join
(
  -- all 110 that are directly followed by  a110
  select just_before.id, just_before.category
  from
  (
    -- all 110 and their direct predecessor
    select events.id, min(before.id) as just_before_id
    from events
    left join events before on before.category = events.category and before.id < events.id
    where events.event = 110
    group by events.id
  ) event110
  join events just_before on just_before.id = event110.just_before_id and just_before.event = 110
) e110 on e110.category = e105.category and e110.id > e105.id
where events.event = 105
group by e110.id;

我不明白为什么第22行没有阻止你的连接。第22行没有中断连接,因为它不在31和121之间,这两个事件都是同一类别中的110个事件,而那些正在连接,因为在那些属于同一类别的事件之间没有其他事件。如果我把你弄糊涂了,我很抱歉,我很高兴得到反馈,如何以更有意义的方式描述这个问题。简单地说:返回所有105,其中至少存在两个相邻的110。是吗?@Thorsten Kettner是的,你是对的,两个相邻的110属于同一类别。谢谢你纠正我的错误question@ThorstenKettner只是想澄清一下,查询应该只得到那些在任何其他105之前有相邻110的105。因此,如果有105、112、105、110、110,则只应返回后面的105是的,我希望具有更大id和等于110的事件的行。但是,如果我阅读正确,您的解决方案中似乎没有110之间的任何其他事件。谢谢,我将对此进行测试,稍后再回来。这是否适用于查询,应该只生成在任何其他105之前具有相邻110的105。因此,如果有105、112、105、110、110,则只应返回后面的105?不,不应返回。我监督了。不过,这只是一个不存在的附加问题。我再补充一句。谢谢你的支持。我期待更新的解决方案谢谢,我会测试一下,稍后再回来。
select distinct max(e105.id)
from events e105
join
(
  -- all 110 that are directly followed by  a110
  select just_before.id, just_before.category
  from
  (
    -- all 110 and their direct predecessor
    select events.id, min(before.id) as just_before_id
    from events
    left join events before on before.category = events.category and before.id < events.id
    where events.event = 110
    group by events.id
  ) event110
  join events just_before on just_before.id = event110.just_before_id and just_before.event = 110
) e110 on e110.category = e105.category and e110.id > e105.id
where events.event = 105
group by e110.id;