mysql - 检索 MySQL 中的下一行

标签 mysql sql

我正在尝试比较字符串“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' 的行,该行后面直接跟着一行 与状态='批准'

db-fiddle

如果您只需要知道没有重复的cid,则使用

select distinct r.cid

关于mysql - 检索 MySQL 中的下一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57097975/

相关文章:

mysql - MySql中树结构(邻接表)的递归CTE

mysql - 为什么 EXISTS() 总是返回 true?

java - Android与php连接Mysql

mysql - 当天查询的日期时间列的最佳索引

sql - 从 select 语句中的 SUM 返回前 5 个

mysql - 尝试显示时 SQL 歧义

mysql - 在 JOIN 中写入具有 HAVING 总和限制的 SQL 计数,而无需在 FROM 中使用子查询

sql - Oracle 过程立即执行

.net - 在 .NET 或 MS SQL 中模拟 MySql OLD_PASSWORD?

php - 使用 PHP 和 PDO 从 MySQL 检索 MEDIUMBLOB 失败