in reply to What's an Efficient Way to Retrieve a Rank from a MySQL Table?

Well, if you need constant up-to-date ranking, just don't keep the whole database contents in memory at once. At first, loop through the rows only selecting the columns needed for ranking. Then do your ranking, and then loop through the database a second time, pulling out the rows in the correct order determined by the ranking. Something like the following perhaps?

my $dbh = DBI->connect( ... ); my $sth1 = $dbh->prepare( 'SELECT studentid, ranker1, ranker2 FROM students' ); $sth1->execute(); my %ranked; while ( my $row = $sth1->fetchrow_arrayref() ) { my $calc_rank = $row->{ranker1} + $row->{ranker2}; %ranked{ $row->{studentid} } = $calc_rank; } my @rank_order = sort { $ranked{$a} <=> $ranked{$b} } keys( %ranked ); my $sth2 = $dbh->prepare( 'SELECT * FROM students WHERE studentid=?' ); for my $studentid ( @rank_order ) { $sth2->execute( $studentid ); my $row = $sth2->fetchrow_hashref(); while ( my($k, $v) = each( %$row ) ) { print( "$k: $v\n" ); } print( "\n\n" ); }
  • Comment on Re: What's an Efficient Way to Retrieve a Rank from a MySQL Table?
  • Download Code

Replies are listed 'Best First'.
Re: Re: What's an Efficient Way to Retrieve a Rank from a MySQL Table?
by Anonymous Monk on May 04, 2004 at 09:31 UTC
    # oops... while ( my $row = $sth1->fetchrow_arrayref() ) { my $calc_rank = $row->{ranker1} + $row->{ranker2}; %ranked{ $row->{studentid} } = $calc_rank; } # should actually read while ( my $row = $sth1->fetchrow_arrayref() ) { my $calc_rank = $row->[1] + $row->[2]; %ranked{ $row->[0] } = $calc_rank; }
Re: Re: What's an Efficient Way to Retrieve a Rank from a MySQL Table?
by soon_j (Scribe) on May 04, 2004 at 10:26 UTC
    Thanks. I'll give this a try as well as the other suggestions.