1

次の問題 (MySQL の新機能) のクエリを作成しようとして、何日も頭を壁にぶつけてきました。

次のデータを持つテーブルAがあります

id, r1, r2, r3, r4, r5, r6, r7, r8, r9, max
 1,  1,  2,  3,  6,  7,  8,  9,  0
 2,  1,  3,  4,  5,  6,  7,  8,  0
 3,  2,  4,  5,  7,  9, 11, 12,  0

max フィールドを行の最大シーケンスに設定する必要があります。たとえば、行 ID 1 の最大シーケンスは 4 (6,7,8,9) であるため、最大フィールドには 4 が表示されます。数値は常に、行の最小から最大 (左から右) にリストされます。

次のようなものになると思います。

SET @r:=0
SET @s:=0

IF(r1 + 1 = r2, IF(@r > @s, @s:=@r, @r:= @r + 1),
IF(r2 + 1 = r3, IF(@r > @s, @s:=@r, @r:= @r + 1),
IF(r3 + 1 = r4, IF(@r > @s, @s:=@r, @r:= @r + 1),
IF(r4 + 1 = r5, IF(@r > @s, @s:=@r, @r:= @r + 1),`

など...しかし、インクリメントは行ごとにのみ適用されるため、機能していないようです??

FOR i <= count(column)
IF count > sequence 
THEN sequence = count
ELSE count ++
NEXT i

どんな助けでも大歓迎です。ありがとう。

4

1 に答える 1

0

おそらく MySQL でこれを完全に行うことができますが、これはかなり面倒だと思います。

私があなたなら、クライアントでこれを行います。これは Perl の実装として機能するはずです。

use DBI;
my $dbh = DBI->connect("dbi:mysql", "user", "password");
my $sth = $dbh->prepare("SELECT * FROM mytable");
$sth->execute();
while (my $row = $sth->fetchrow_hashref()) {
    my $id = $row->{id};
    my @r;
    push @r, $row->{r1}, $row->{r2}, $row->{r3},
             $row->{r4}, $row->{r5}, $row->{r6},
             $row->{r7}, $row->{r8}, $row->{r9};
    my $max = 1; # max run
    my $t = 1;   # local max run
    for (my $i = 1; $i < 9; $i++) {
        if ($r[$i] == $r[$i-1]+1) {
            $t++;
        } else {
            $t = 1;
        }
        if ($t > $max) {
            $max = $t;
        }
    }
    $dbh->do(qq{ UPDATE mytable SET max = ? WHERE id = ?}, undef,
                                   $max,         $id);
}
$sth->finish();
$dbh->disconnect();
于 2012-11-11T07:39:07.780 に答える