[color="#0000ff"]use[/color] test;
[color="#008000"]-- create[/color]
[color="#0000ff"]CREATE[/color] [color="#0000ff"]TABLE[/color] `strange` (
`id` [color="#0000ff"]int[/color](11) [color="#0000ff"]NOT[/color] [color="#0000ff"]NULL[/color] AUTO_INCREMENT,
`money` [color="#0000ff"]int[/color](11) [color="#0000ff"]NOT[/color] [color="#0000ff"]NULL[/color],
[color="#0000ff"]PRIMARY[/color] [color="#0000ff"]KEY[/color] (`id`)
) ENGINE=InnoDB
[color="#008000"]-- insert[/color]
[color="#0000ff"]insert[/color] [color="#0000ff"]into[/color] strange (money) [color="#0000ff"]values[/color] (1),(1),(1),(2),(2),(1),(1),(1),(1),(2),(3),(2),(2),(2),(3),(3),(3);
[color="#008000"]-- procedure[/color]
DELIMITER //
[color="#0000ff"]CREATE[/color] [color="#0000ff"]PROCEDURE[/color] getSequence ([color="#0000ff"]IN[/color] mn [color="#0000ff"]INT[/color])
[color="#0000ff"]BEGIN[/color]
[color="#0000ff"]SELECT[/color] `id` [color="#0000ff"]FROM[/color] strange [color="#0000ff"]as[/color] R
[color="#0000ff"]JOIN[/color]
([color="#0000ff"]SELECT[/color]
([color="#0000ff"]SELECT[/color] [color="#0000ff"]MIN[/color](CID)
[color="#0000ff"]FROM[/color] (
[color="#0000ff"]select[/color] `id` [color="#0000ff"]AS[/color] CID,
[color="#0000ff"]CASE[/color]
[color="#0000ff"]WHEN[/color] [color="#0000ff"]EXISTS[/color] ([color="#0000ff"]SELECT[/color] `id` [color="#0000ff"]FROM[/color] strange [color="#0000ff"]as[/color] SS1 [color="#0000ff"]WHERE[/color] `id` = CID -1 [color="#0000ff"]AND[/color] money = mn)
[color="#0000ff"]THEN[/color] 1
[color="#0000ff"]ELSE[/color] 0
[color="#0000ff"]END[/color] [color="#0000ff"]AS[/color] P,
[color="#0000ff"]CASE[/color]
[color="#0000ff"]WHEN[/color] [color="#0000ff"]EXISTS[/color] ([color="#0000ff"]SELECT[/color] `id` [color="#0000ff"]FROM[/color] strange [color="#0000ff"]as[/color] SS2 [color="#0000ff"]WHERE[/color] `id`= CID +1 [color="#0000ff"]AND[/color] money = mn)
[color="#0000ff"]THEN[/color] 1
[color="#0000ff"]ELSE[/color] 0
[color="#0000ff"]END[/color] [color="#0000ff"]AS[/color] N
[color="#0000ff"]FROM[/color] strange [color="#0000ff"]as[/color] SS3
[color="#0000ff"]WHERE[/color] money = mn
) [color="#0000ff"]as[/color] seqMx
[color="#0000ff"]WHERE[/color] seqMx.N = 0 [color="#0000ff"]AND[/color] seqMx.P <> 0) [color="#0000ff"]AS[/color] MXCID,
([color="#0000ff"]SELECT[/color] [color="#0000ff"]MAX[/color](CID)
[color="#0000ff"]FROM[/color] (
[color="#0000ff"]select[/color] `id` [color="#0000ff"]AS[/color] CID,
[color="#0000ff"]CASE[/color]
[color="#0000ff"]WHEN[/color] [color="#0000ff"]EXISTS[/color] ([color="#0000ff"]SELECT[/color] `id` [color="#0000ff"]FROM[/color] strange [color="#0000ff"]as[/color] SS4 [color="#0000ff"]WHERE[/color] `id` = CID -1 [color="#0000ff"]AND[/color] money = mn)
[color="#0000ff"]THEN[/color] 1
[color="#0000ff"]ELSE[/color] 0
[color="#0000ff"]END[/color] [color="#0000ff"]AS[/color] P,
[color="#0000ff"]CASE[/color]
[color="#0000ff"]WHEN[/color] [color="#0000ff"]EXISTS[/color] ([color="#0000ff"]SELECT[/color] `id` [color="#0000ff"]FROM[/color] strange [color="#0000ff"]as[/color] SS5 [color="#0000ff"]WHERE[/color] `id`= CID +1 [color="#0000ff"]AND[/color] money = mn)
[color="#0000ff"]THEN[/color] 1
[color="#0000ff"]ELSE[/color] 0
[color="#0000ff"]END[/color] [color="#0000ff"]AS[/color] N
[color="#0000ff"]FROM[/color] strange [color="#0000ff"]as[/color] SS6
[color="#0000ff"]WHERE[/color] money = mn
) [color="#0000ff"]as[/color] seqMn
[color="#0000ff"]WHERE[/color] seqMn.P = 0 [color="#0000ff"]AND[/color] seqMn.N <> 0 [color="#0000ff"]AND[/color] seqMn.CID < MXCID) [color="#0000ff"]AS[/color] MNCID
) [color="#0000ff"]AS[/color] T
[color="#0000ff"]ON[/color] T.MXCID >= R.`id` [color="#0000ff"]AND[/color] T.MNCID <= R.`id`;
[color="#0000ff"]END[/color] //
DELIMITER ;
[color="#008000"]-- sample usage[/color]
[color="#0000ff"]CALL[/color] getSequence(3);