Mysql 根据前面的行获取值

Mysql 根据前面的行获取值,mysql,sql,Mysql,Sql,这是我的桌子 +-----+-----+ | A | B | +-----+-----+ | 1 | 300 | | 2 | 300 | | 3 | 0 | | 4 | 0 | | 5 | 100 | | 6 | 100 | | 7 | 100 | | 8 | 100 | | 9 | 0 | | 10 | 0 | +-----+-----+ 给定一个值,比如说100,我需要得到这个值的第一行,其中前一行等于0(以增加a的顺序) 产出

这是我的桌子

+-----+-----+
| A   | B   |
+-----+-----+
|  1  | 300 |
|  2  | 300 |
|  3  | 0   |
|  4  | 0   |
|  5  | 100 |
|  6  | 100 |
|  7  | 100 |
|  8  | 100 |
|  9  | 0   |
| 10  | 0   |
+-----+-----+
给定一个值,比如说100,我需要得到这个值的第一行,其中前一行等于0(以增加a的顺序)

产出将是:

+-----+-----+
|  A  |  B  |
+-----+-----+
|  5  | 100 |
+-----+-----+

数据库表是一组无序的行。当你说“第一行”和“前一行”时,我假设你的意思是按A的递增顺序

可以使用用户变量执行以下操作:

set @val := 100;   -- to be searched
set @pre := -999999999;

select a, b
from (
select
    t.*,
    if(
        @val = b and @pre = 0,   -- if the required value is found and last value was 0
        if(@pre := b, 1, 1),     -- then 1
        if(@pre := b, 0, 0)      -- else 0
    ) flag
from t
order by A
) t where flag = 1;

内部联接本身如何

输入

// From the demo provided in comments.

+-----+-----+
|  A  |  B  |
+-----+-----+
|   1 | 300 |
|   2 | 300 |
|   3 |   0 |
|   4 |   0 |
|   5 | 100 |
|   6 | 100 |
|   7 | 100 |
|   8 | 100 |
|   9 |   0 |
|  10 |   0 |
|  11 |   0 |
|  12 |   0 |
|  13 | 100 |
|  14 | 100 |
|  15 | 100 |
|  16 |   0 |
|  17 |   0 |
|  18 |   0 |
|  19 |   0 |
|  20 | 100 |
|  20 | 100 |
|  20 | 100 |
|  21 | 100 |
|  24 |   0 |
+-----+-----+
// As requested in the demo.

+-----+-----+
|  A  |  B  |
+-----+-----+
|   5 | 100 |
|  13 | 100 |
|  20 | 100 |
+-----+-----+
查询

SELECT yt1.A, MIN(yt1.B) AS B
FROM YourTable yt1
INNER JOIN YourTable yt2 ON yt2.A = yt1.A - 1
WHERE yt1.B = 100 AND yt2.B = 0
GROUP BY yt1.A
输出

// From the demo provided in comments.

+-----+-----+
|  A  |  B  |
+-----+-----+
|   1 | 300 |
|   2 | 300 |
|   3 |   0 |
|   4 |   0 |
|   5 | 100 |
|   6 | 100 |
|   7 | 100 |
|   8 | 100 |
|   9 |   0 |
|  10 |   0 |
|  11 |   0 |
|  12 |   0 |
|  13 | 100 |
|  14 | 100 |
|  15 | 100 |
|  16 |   0 |
|  17 |   0 |
|  18 |   0 |
|  19 |   0 |
|  20 | 100 |
|  20 | 100 |
|  20 | 100 |
|  21 | 100 |
|  24 |   0 |
+-----+-----+
// As requested in the demo.

+-----+-----+
|  A  |  B  |
+-----+-----+
|   5 | 100 |
|  13 | 100 |
|  20 | 100 |
+-----+-----+

你能解决这个问题来处理像这样重复的B值吗?因为即使删除了GROUP BY,它也只会得到一个序列!这得到了所有的值,请看演示!我明白了,可能是因为A不是唯一的,也可以重复@0x58看到更新的答案,还有这个。我选择这个作为完美的解决方案,因为它可以处理重复的B值。有机会得到这个的php版本吗?