1211chef: ORDER BY vor GROUP by

Beitrag lesen

hi (*), also ich habs jetzt so gemacht weil ich den subselect von christian nicht in den griff bekomme.

ich bilde also erst mal eine liste @ZE mit kundennummerpaaren.

  my $ML=$dbh->prepare('SELECT kd1,kd2 FROM T WHERE   kd1=?   OR   kd2=?   GROUP BY kd1 + kd2') || die $DBI::errstr;
  $ML->execute($kdnr,$kdnr) || die $DBI::errstr; 
my $DL=$ML->fetchall_arrayref; 
my @ZE = map {join";",@$_} @$DL;

dann lasse ich die kundennummernpaare in einer schleife durchlaufen und selektiere alle datensätze die auf meine bedingungen passen nach time DESC. das heisst der letzte gelieferte listeneintrag pro kundennummerpaar ist dann auch der jüngste datensatz den ich brauche. durch das einfache fetch steht in $L dann auch der letzte drin. den pusche ich dann einfach pro schleifendurchlauf in die liste @PL.

  my @PL; 
  foreach (@ZE) {
    my @E=split(";",$_); my $kd2; if ($E[0] eq $kdnr) { $kd2=$E[1]; } else { $kd2=$E[0]; }
    my $gr=$dbh->prepare('SELECT ident,kd1,kd2,time,bla,ble,bli,blu FROM T
    WHERE kd1=? AND kd2=? AND eastate=?   OR   kd1=? AND kd2=? AND eastate=?  ORDER BY time DESC') ||   die $DBI::errstr;
    $gr->execute($kdnr,$kd2,'A',  $kd2,$kdnr,'E')  || die $DBI::errstr;
    my $L=$gr->fetch;
    push(@PL,"@$L[0];@$L[1];@$L[2];@$L[3];@$L[4];@$L[5];@$L[6];@$L[7]"); }

wenn ich mir das ankuck wird mir übel, aber es funktioniert.

leider hab ich das ergebnis in @PL nicht nach zeit sortiert, das wollte ich so machen:

@PL = (sort { $a->[3] <=> $b->[3] } @PL); 

(feld 3 ist der timestamp pro datensatz)

mit use strict; erhalte ich aber eine fehlermeldung.

Can't use string ("1097;1155;1156;1459960752;1;E;te"...) as an ARRAY ref while "strict refs" in use at zacklzement.pl line 70.

ich weiss ich hatte das auch schon mal gelöst, kann mich aber wieder mal nicht erinnern wie ich das schreiben muss. weiss es zufällig jemand? in der liste @PL stehen doch keine ARRAYreferenzen wie zb. in $L. woher kommt das?

gruss Gustl