use DBI; my ($db, $user, $pass, $dbh, $query, $sth, $record, %clients); $db = 'database'; $user = 'user'; $pass = 'password'; ### Log into database die "Couldn't connect to database: " . DBI->errstr if !($dbh = DBI->connect("DBI:mysql:$db", $user, $pass)); ### Select client list $query = 'SELECT * FROM clients'; $sth = $dbh->prepare($query); $sth->execute(); ### Store by record IDN or other identifying field $clients{$record->{'idn'}} = $record while $record = $sth->fetchrow_hashref(); ### Add data from different table $query = 'SELECT * FROM client_data'; $sth = $dbh->prepare($query); $sth->execute(); ### Index on same IDN while ($record = $sth->fetchrow_hashref()) { push @{$clients{$record->{'client'}}{$_}}, $record for qw/client data fields here/; } ### Sort on some field to return to desired order for $record (sort { $a->{'name'} cmp $b->{'name'} } values %clients) { ### Do something with record }