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" ); }
In reply to Re: What's an Efficient Way to Retrieve a Rank from a MySQL Table?
by Anonymous Monk
in thread What's an Efficient Way to Retrieve a Rank from a MySQL Table?
by soon_j
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |