use warnings; use strict; use Data::Dump; use DBI; my $titlesperpage = 10; # set up a dummy database my $dbh = DBI->connect("dbi:SQLite::memory:", undef, undef, { RaiseError=>1 }); $dbh->do(<<'END'); CREATE TABLE messages ( msgID INTEGER, threadID INTEGER ) END my $sth_i = $dbh->prepare( 'INSERT INTO messages (msgID, threadID) VALUES (?,?)'); $sth_i->execute($_,$_>>4) for 0..127; for my $currentpage (1..5) { # simulate requests for different pages my $startcount = ($currentpage - 1) * $titlesperpage + 1; my $stopcount = $currentpage * $titlesperpage; dd $startcount, $stopcount; my $sth_s = $dbh->prepare('SELECT msgID, threadID FROM messages'); $sth_s->execute; my %threadIDs; my $rowcnt = 1; while ( my $row = $sth_s->fetchrow_hashref ) { $threadIDs{ $row->{threadID} }++; if ( $rowcnt >= $startcount && $rowcnt <= $stopcount ) { dd $row->{msgID}; } } continue { $rowcnt++ } dd \%threadIDs; }