Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL-如何根据前一行中的值查找行_Mysql_Nested Query - Fatal编程技术网

MySQL-如何根据前一行中的值查找行

MySQL-如何根据前一行中的值查找行,mysql,nested-query,Mysql,Nested Query,我有一张餐桌: create table settings( id int , date datetime , user varchar(20) , status varchar(10) ); insert into settings values (1 , '2020-07-10 14:36:06', 'user1', 'INACTIVE'), (1 , '2020-07-10 14:39:54', 'user1', 'ACTIVE'), (1 , '2020-

我有一张餐桌:

create table settings(
    id int
  , date datetime
  , user varchar(20)
  , status varchar(10)
  );

insert into settings values
 (1 , '2020-07-10 14:36:06', 'user1', 'INACTIVE'),
 (1 , '2020-07-10 14:39:54', 'user1', 'ACTIVE'),
 (1 , '2020-07-10 14:44:06', 'user1', 'INACTIVE'),
 (1 , '2020-07-10 14:46:06', 'user2', 'INACTIVE'),
 (1 , '2020-07-10 14:49:06', 'user2', 'SCHEDULED'),
 (1 , '2020-07-10 14:55:06', 'user2', 'ACTIVE'),
 (2 , '2020-07-12 14:36:06', 'user1', 'INACTIVE'),
 (2 , '2020-07-13 14:39:54', 'user1', 'INACTIVE'),
 (2 , '2020-07-13 16:44:06', 'user1', 'ACTIVE'),
 (2 , '2020-07-15 14:46:06', 'user3', 'INACTIVE'),
 (2 , '2020-07-15 15:49:06', 'user3', 'INACTIVE'),
 (2 , '2020-07-17 14:46:06', 'user3', 'ACTIVE')
 ;
插入代码的示例代码位于中

该过程从
INACTIVE
状态开始,由系统安排,然后用户可以更改为
scheduled
ACTIVE

我需要查找状态为
活动
的行,但只查找之前状态为
非活动
的行,按用户分组。特定情况下(不确定是否可能)查找状态为
ACTIVE
但前几行具有
SCHEDULED->INACTIVE
序列的行

我在下面的屏幕截图上选择了应返回的行:

我正在尝试使用它,但结果应该返回当前行下的前一行

select * from (  
select @rownum:=@rownum+1 row, a.* 
from settings a
where a.status = 'ACTIVE'
) as cr

LEFT JOIN (SELECT  @rownum2:=@rownum2+1 row, b.* FROM settings b
where b.status = 'INACTIVE' ) as pr
on cr.id = pr.id and cr.date > pr.date

您可以使用自连接来完成此操作。 执行自联接后,从一个表(例如A)获取每个日期的活动时间,从另一个表(例如B)获取非活动时间,其中
B.date

查询:

SELECT A.user,max(B.date) as Inactive,min(A.date) as Active 
FROM settings A JOIN settings B
ON A.id=B.id and A.user=B.user
WHERE A.status = 'ACTIVE'
AND B.status = 'INACTIVE'
AND B.date<A.date
GROUP BY  A.date,A.user
选择A.user,max(B.date)为非活动,min(A.date)为活动
从设置A加入设置B
在A.id=B.id和A.user=B.user上
其中A.status='ACTIVE'
和B.status='INACTIVE'

和B.date这将帮助您
从设置中选择*,其中status='ACTIVE'
您可以通过此按钮找到。如果你认为主动是消极的,没有什么独特的,所以它只意味着活跃!BloodyLogic Sqlserver与mysql不同,使用其中一种方式编写的代码不一定会传输到另一种方式。您的主键是什么?@草莓能否提供一个边缘大小写,以便我可以详细查看它?对不起,我的意思是id。@草莓请发布一个sqlfiddle,并且缺少结果中预期的值。这是第一列在上面的OP图片中,仅此而已。我们可以假设结果应该包含以下列(id、date、user、status)&该列是我假设的某个外键,输出中不需要它。若OP想要那个列,那个么只需将它添加到“选择列表”和“分组依据”中。我觉得输出中没有必要这样做。