You could do something like this:
Code:
$result = $vbulletin->db->query_read_slave("SELECT ranks.*, roster.roster_id, roster.member_name, roster.roster_rank
FROM roster LEFT JOIN ranks ON(ranks.Rank_id = roster.roster_rank)
ORDER BY Rank_order ASC, member_name ASC");
$roster = array();
while ($row = $vbulletin->db->fetch_array($result))
{
$roster[$row['Rank_id']][] = $row;
}
Then you'd register $roster to your template (or use preRegister if it's an existing template), and in the template you can use <vb:each> to format the blocks, like:
Code:
<vb:each from="roster" value="members">
{vb:var members.0.Rank_desc}<br />
<vb:each from="members" value="member">
{vb:var member.name}<br />
</vb:each>
<br />
</vb:each>