Lose the [font=monospace]GROUP BY region_id[/font] clause. Most DBMSs wouldn't even let you use it here because it would cause the query to throw away arbitrary information - namely, all but one value of county_id/name for each region_id.
Change the sorting clause to [font=monospace]ORDER BY a.region_name, b.county_name[/font].
The common method for generating the list itself is to remember (in a variable) which region sublist you're printing rows for. Each time you fetch another row, look to see what region it refers to. If it's the same one, just go ahead and print the country. If it's different, then you've just finished one region and are starting another, so print the row for the new region's name and update that variable to match.
On the other hand, I may be misunderstanding your schema: [font=monospace]a.region_id=b.county_id[/font] looks weird to me because I wouldn't expect IDs for two different entities to have anything to do with each other ("where suburb.postal_code = country.international_dialling_code"?).