我正在尝试比较字符串“reject”是否出现在字符串“approve”之前。例如,
+----+----------+
| cid| Status |
+----+----------+
| 1 | pending |
| 1 | reject |
| 1 | pending |
| 1 | approve |
| 2 | pending |
| 2 | reject |
| 2 | approve |
| 3 | pending |
| 3 | approve |
| 3 | reject |
| 4 | approve |
| 4 | pending |
| 4 | approve |
+----+----------+
然后从上表中,我想返回id 2,因为字符串approve直接出现在字符串reject之后。到目前为止,我的想法是创建另一列包含下一行值。所以在sql查询之后,它会像下面这样:(请注意,不包括id 3,因为即使在字符串reject之后出现一个字符串approve,但它不是来自同一个id)。
+----+----------+------------+
| cid| Status | Next Value |
+----+----------+------------+
| 1 | pending | reject |
| 1 | reject | pending |
| 1 | pending | approve |
| 1 | approve | pending |
| 2 | pending | reject |
| 2 | reject | approve |
| 2 | approve | pending |
| 3 | pending | approve |
| 3 | approve | reject |
| 3 | reject | approve |
| 4 | approve | pending |
| 4 | pending | approve |
| 4 | approve | (null) |
+----+----------+------------+
有了上述想法,我仍然不确定如何编写查询并需要帮助构建它。我尝试搜索,但大多数答案都在 SQL Server 中使用滞后函数。此外,任何其他方法将不胜感激。 (注:其中有一个 ID 列,代表第 1,2,...,12 等行号。另外,还有一个日期列,因此输入状态将是有序的。
最佳答案
如果您的服务器不支持诸如LAG()
之类的窗口函数,您可以使用:
select r.id, r.cid
from mytable r
join mytable a
on a.cid = r.cid
and a.id = (
select min(id)
from mytable a2
where a2.cid = r.cid
and a2.id > r.id
)
where r.Status = 'reject'
and a.Status = 'approve'
这将返回一个带有 Status = 'reject'
的行,该行后面直接跟着一行
与状态='批准'
。
如果您只需要知道没有重复的cid
,则使用
select distinct r.cid
关于mysql - 检索 MySQL 中的下一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57097975/