One option is to fetch all of the posts to a single array and filter that array 50 ways. This would only generate the one query:
$posts = get_posts(array(
'posts_per_page' => -1,
'post_type' => 'school'
));
To filter your array you would do something like this:
$this_state = "Texas";
$state_posts = array_filter($posts, function($results) use($this_state) {
return $results['state'] == $this_state;
});
From there, $state_posts
should contain a subset of $posts
where the State is Texas. Modify appropriately for each of your 50 groups.
This is untested but modeled on a very similar template I wrote last week.