Php MySQL:选择后跟特定行的行
只有在以下示例表中有两个值为110的后续和连接事件,且所有事件都具有相同的类别时,如何选择值为105的事件id 通过连接值为110的事件,我指的是在相同类别的110个事件之间不存在106或112等其他事件的情况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
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;