php – MySQL查找行
发布时间:2020-05-25 08:57:38 所属栏目:PHP 来源:互联网
导读:让我们说100是一个开始,101是一个停止事件.这些应该交替,我想在他们不知道的时候找出它们.每次开始都应该有一个先前的停止事件.鉴于此表: ID EVENT_ID10 100 // a start event11 101 // a stop event12 99 // some irrelevant event13 100 // .. and so on:1
|
让我们说100是一个开始,101是一个停止事件.这些应该交替,我想在他们不知道的时候找出它们.每次开始都应该有一个先前的停止事件.鉴于此表: ID EVENT_ID 10 100 // a start event 11 101 // a stop event 12 99 // some irrelevant event 13 100 // .. and so on: 14 101 15 100 16 99 // some irrelevant event 17 100 // <-- duplicate event: bad 18 100 // <-- duplicate event: bad again. 19 101 我遗漏了DATETIME专栏. 如何找到#15和#17,考虑到开始不应连续出现两次? EVENT_ID FROM_ID FROM_DATETIME UPTO_ID UPTO_DATETIME 100 15 2014-01-01 14:00 17 2014-01-01 16:00 我想它可以像这样工作: 有可能在MySQL中找到它吗?我可以在PHP中处理这个问题,但我宁愿避免这种情况. 在我的示例中,所有行都具有相同的日期时间值.DROP TABLE IF EXISTS T;
CREATE TABLE T
(`ID` int auto_increment primary key,`EVENT_ID` int,dt timestamp)
;
INSERT INTO T
(`ID`,`EVENT_ID`)
VALUES
(10,100),(11,101),(12,99),(13,(14,(15,(16,(17,(18,(19,101)
;
select id,event_id,dt as up_to_dt,prevgood,prevdt as from_dt from
(
select
T.*,if((@startstop = 100 and event_id = 101) or (@startstop = 101 and event_id = 100),'good','bad') as goodbad,@prevgood := if(if((@startstop = 100 and event_id = 101) or (@startstop = 101 and event_id = 100),'bad') = 'bad',@prevgood,id) as prevgood,@prevdt := if(if((@startstop = 100 and event_id = 101) or (@startstop = 101 and event_id = 100),@prevdt,dt) as prevdt,@startstop := event_id
from
T,(select @startstop:=101,@prevgood:=0,@prevdt:=0) vars
where event_id in (100,101)
order by id
) sq
where goodbad = 'bad';
返回 +----+----------+---------------------+----------+---------------------+ | id | event_id | up_to_dt | prevgood | from_dt | +----+----------+---------------------+----------+---------------------+ | 17 | 100 | 2014-01-20 09:12:20 | 15 | 2014-01-20 09:12:20 | | 18 | 100 | 2014-01-20 09:12:20 | 15 | 2014-01-20 09:12:20 | +----+----------+---------------------+----------+---------------------+ (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
