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版本吗?