English help English ... English take over the world!!
Two ways I can see, one could max out on the query length if your list of towns gets too big but is much quicker. Second is like yours but compacted.
//Like yours but compacted
$towns = array('Bath', 'Conventry', 'Liverpool', 'Manchester', 'Hull AKA Hell', 'High Wycombe', 'Newcastle');
foreach($towns as $town) {
$sql="SELECT ROUND(MIN(RoomsFrom)) AS RoomsFrom FROM hotel WHERE GeoTown='$town'";
$res = mysql_query($sql) or die($sql."\n".mysql_error());
list($results[$town]) =mysql_fetch_row($res);
}
//Risk of overflow but far quiker
$towns = array('Bath', 'Conventry', 'Liverpool', 'Manchester', 'Hull AKA Hell', 'High Wycombe', 'Newcastle');
$sql = "SELECT GeoTown, ROUND(MIN(RoomsFrom)) as RoomsFrom FROM hotel WHERE GeoTown IN ('".implode("','", $towns)."') GROUP BY GeoTown";
$res = mysql_query($sql) or die($sql."\n".mysql_error());
while($row = mysql_fetch_array($res)) {
$results[$row['town']] = $row['RoomsFrom'];
}
Great thing with sticking the towns in an array as it leads you perfectly into putting this into a function, then you can test one way, if it starts to fail you can just swap the implementation and not have to worry about your list of towns as they're stored elsewhere.